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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章