常见的 Solon Rpc 开发，会有三部分组成：

* 服务的接口声明（会被下面两方引用）
* 服务的实现或提供方（一般是独立的服务）
* 服务的使用或消费方


### 1、服务接口定义（可以做成，服务端与客户端公用）

```
新建项目：userapi.client
```

接口的定义，可以不引入任何框架。但它，必须独立成存，有完整的领域独立性。尽量不要把它放到 common 之类的概念里。

```java
//
// 注意：函数名不能相同!!!
//
public interface UserService{
    void add(User user);
    User getById(long userId);
}
```

附带数据实体定义（实体要实现 Serializable，以适应任何序列化方案）

```java
@Data
public class User implements Serializable{ 
    long userId;
    String name;
    int level;
}
```


### 2、服务端项目，服务实现

```
新建项目：userapi （引入依赖：userapi.client）
```

本案采用 http + json 架构，只需引入： [solon-web](/article/281) 即可。实际上，开发与 web 项目没太大区别。


应用主要配置

```yml
server.port: 9001

solon.app:
  group: "demo"
  name: "userapi"
```

应用主要代码

```java
public class ServerApp{
    public static void main(String[] args){
        Solon.start(ServerApp.class, args);
    }
}

@Mapping("/rpc/v1/user")
@Remoting
public class UserServiceImpl implements UserService{
    @Inject
    UserMapper userMapper;
    
    @Override
    public void add(User user){
        userMapper.add(user);
    }
    
    @Override
    public User getById(long userId){
        return userMapper.getById(userId);
    }
}
```

打包后，启动服务

```
java -jar userapi.jar
```


### 3、客户端项目，服务消费


```
新建项目：userdemo （引入依赖：userapi.client）
```

本案采用 http + json 架构，只需引入：`solon-rpc` 即可（它集成了rpc客户端需要的组件）。开发与web项目也没啥区别。

应用主要配置

```yml
server.port: 8081

solon.app:
  group: "demo"
  name: "userdemo"
```

应用主要代码

```java
public class ClientApp{
    public static void main(String[] args){
        Solon.start(ClientApp.class, args);
    }
}

@Mapping("user")
@Controller
public class UserController {
    //直接指定地址和序列化方案
    @NamiClient(url = "http://localhost:9001/rpc/v1/user", headers = ContentTypes.JSON)
    UserService userService;
    
    @Post
    @Mapping("register")
    public Result register(User user){
        //调用远程服务，添加用户
        userService.add(user);
        
        return Result.succeed();
    }
   
}
```

打包后，启动服务。要与 server 的端口不同，这样可以在本机同时运行两个服务。

```shell
java -jar userdemo.jar
```

