Solon

Solon Rpc 开发定制

</> markdown

像上文示例中,通过 headers 申明了自己的内容类型(它会自动匹配对应的编码器):

@Maping("user")
public class UserController {
    //指定服务名、路径和序列化方案(新的不用关注服务地址)
    @NamiClient(name = "userapi",  path="/rpc/v1/user", headers=ContentTypes.JSON);
    UserService userService;
    
    @Post
    @Mapping("register")
    public Result register(User user){
        //调用远程服务,添加用户
        userService.add(user);
        
        return Result.succeed();
    }
   
}

用起来,显然还是麻烦。

1、通过配置器进行定制(适合Aop模式)

@Configuration
public class Config {
    @Bean
    public NamiConfiguration initNami(){
        return new NamiConfiguration() {
            @Override
            public void config(NamiClient client, NamiBuilder builder) {
                //指定编码器与解码器
                builder.decoder(SnackDecoder.instance);
                builder.encoder(SnackTypeEncoder.instance);
            }
        };
    }
}

经过定制后,就不需要指定内容类型了:

@Maping("user")
public class UserController {
    //指定服务名、路径和序列化方案(新的不用关注服务地址)
    @NamiClient(name = "userapi",  path="/rpc/v1/user");
    UserService userService;
    
    @Post
    @Mapping("register")
    public Result register(User user){
        //调用远程服务,添加用户
        userService.add(user);
        
        return Result.succeed();
    }
}

2、基于构建器进行定制(适配手动模式)

public class DemoApp {
    public static void main(String[] args){
        Solon.start(DemoApp.class, args);
        
        UserService userService = Nami.builder()
                                   .name("userapi")
                                   .path("/rpc/v1/user")
                                   .decoder(SnackDecoder.instance)
                                   .encoder(SnackTypeEncoder.instance)
                                   .create(UserService.class);
                           
        userService.add(user);
    }
}