• GitHub Open Feign 使用总结


    原文地址

    公司项目目前使用 SOA 架构(Service-oriented architecture:服务导向架构),每个服务作为一个单体对外提供接口,服务之间使用 GitHub OpenFeign 调用接口。

    服务提供者正常提供接口,把需要暴露的接口封装为一个 client jar 包,服务调用者正常引入 jar 包,直接调用 jar 方法即可调用服务提供者接口。此文相关代码示例

    Provider Api

    @RestController
    public class UserController {
    
        @PostMapping("/signin")
        public ApiResponse<Void> doSignin(@RequestParam("username") String username, @RequestParam("password") String password) {
            if (username.equals("") && password.equals("")) {
                return ApiResponse.fail(500);
            }
            return ApiResponse.success();
        }
    }
    

    Provider Client

    ProviderClientBuilder

    @Configuration
    public class ProviderClientBuilder {
        @Value("${provider.domain}")
        public String providerDomain;
        @Value("${provider.socketTimeout:60000}")
        public int socketTimeout;
        @Value("${provider.connectTimeout:10000}")
        public int connectTimeout;
    
        @Bean
        public UserApi buildProviderApi() {
            Preconditions.checkArgument(StringUtils.isNotBlank(providerDomain));
            return Feign.builder()
                    .decoder(new GsonDecoder())
                    .encoder(new FormEncoder())
                    .logger(new Slf4jLogger(UserApi.class))
                    .retryer(Retryer.NEVER_RETRY)
                    .logLevel(Logger.Level.FULL)
                    .client(new AccessTraceHttpClient(httpClient(), requestConfig()))
                    .target(UserApi.class, providerDomain);
        }
        ...
    }
    

    UserApi

    @Headers("Content-Type: application/x-www-form-urlencoded") // 请求的编码格式为 application/x-www-form-urlencoded
    public interface UserApi {
        @RequestLine("POST /signin")
        public ApiResponse<Void> signin(@Param("username") String username, @Param("password") String password);
    
        @RequestLine("GET /status/version")
        public ApiResponse<String> statusVersion();
    }
    

    Consumer Api

    @RestController
    public class HomeController {
        @Autowired
        private UserApi userApi;
    
        @PostMapping("/signin")
        public ApiResponse<Void> signin() {
            return userApi.signin("admin","admin");
        }
    }
    
    @ComponentScan(basePackages = "wang.depp")
    @SpringBootApplication
    public class ConsumerApiApplication {
    	public static void main(String[] args) {
    		SpringApplication.run(ConsumerApiApplication.class, args);
    	}
    }
    

    ProviderClientBuilder 为配置类,当 Provider 和 Consumer package 路径不同时,需要指定包扫描路径,使引入包配置类在容器启动时就加载到容器。

    application.properties

    server.port=8888
    provider.demain=http://localhost:8080/ # 完整书写
    provider.socketTimeout=60000
    provider.connectTimeout=10000
    

    pom.xml

    		<dependency>
    			<groupId>wang.depp</groupId>
    			<artifactId>provider-client</artifactId>
    			<version>1.0.6</version>
    		</dependency>
    

    踩过的坑

    1、java.lang.IllegalArgumentException: target values must be absolute.

    • provider-api 的 domain 要写全;Service 参数问题,没有获取到具体数据,还为 ${*}

    2、Caused by: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING at line 1 column 1 path $

    • **Api 和 Controller 方法的返回值类型对不上,比如:Api 站拦截器包装了一层 ApiResponse

    3、接收参数不能为 Date

    • 因为使用 application/x-www-form-urlencoded传输时将参数链接到 URL,将转换为 String

    可通过为不同环境配置不同的服务提供者 domain

  • 相关阅读:
    进程间通讯,线程间通讯
    进程与线程
    学习自测6.0
    学习自测5.0
    学习自测4.0
    学习自测3.0
    学习自测2.0
    学习自测1.0
    PS中怎么复制某个图层的效果?
    初学前端犯下的错误(用于反省)
  • 原文地址:https://www.cnblogs.com/deppwang/p/13917285.html
Copyright © 2020-2023  润新知