一文教你如何使用原生的Feign
简介
Feign 是一个基于Java的HTTP客户端,用于将HTTP请求映射到界面上,并将调用者与远程服务进行解耦。Feign通过使用注解支持请求/响应编码、注释传播、错误处理等功能。
使用原生的Feign的步骤
步骤一:引入依赖
首先,我们需要在项目中引入feign相关的依赖,以下是一些常用的依赖:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
<version>2.2.9.RELEASE</version>
</dependency>
步骤二:创建Feign客户端接口
在创建Feign客户端接口时,我们需要使用 @FeignClient
注解来指定服务名称,@RequestMapping
注解来指定访问路径和请求参数。 它相当于使用 HTTP 请求映射到我们的 Java 方法。
@FeignClient(name = "clientname")
public interface MyFeignClient {
@RequestMapping(value = "/get", method = RequestMethod.GET)
String get();
@RequestMapping(value = "/post", method = RequestMethod.POST)
String post(@RequestParam(value = "param") String param);
}
步骤三:在Controller中调用Feign客户端接口
@RestController
public class MyController {
@Autowired
private MyFeignClient myFeignClient;
@GetMapping("/testFeignGet")
public String testFeignGet() {
return myFeignClient.get();
}
@GetMapping("/testFeignPost")
public String testFeignPost() {
return myFeignClient.post("testParam");
}
}
示例
示例一:调用远程http服务
@FeignClient(name = "httpbin", url = "https://httpbin.org")
public interface HttpBinClient {
@GetMapping("/get")
HttpBinResponse get();
@PostMapping("/post")
HttpBinResponse post(HttpBinRequest request);
}
@Data
class HttpBinResponse {
private String url;
private Map<String, String> headers;
private HttpBinResponseArgs args;
public HttpBinResponse() {
}
}
@Data
class HttpBinResponseArgs {
private String any;
public HttpBinResponseArgs() {
}
}
@Data
class HttpBinRequest {
private String any;
public HttpBinRequest() {
}
}
上述代码中,我们定义了一个用于调用远程服务的接口 HttpBinClient
,其中远程服务的地址是 https://httpbin.org
。该接口还包含 get()
和 post()
方法,分别对应着远程服务的 GET 和 POST 请求。同时我们还定义了调用返回值,其中 HttpBinResponse
对应着服务器响应的 JSON 格式数据。
接下来,我们通过调用 HttpBinClient
来测试一下:
@RestController
public class MyController {
@Autowired
private HttpBinClient httpBinClient;
@GetMapping("/httpbinGet")
public HttpBinResponse httpbinGet() {
return httpBinClient.get();
}
@PostMapping("/httpbinPost")
public HttpBinResponse httpbinPost() {
HttpBinRequest request = new HttpBinRequest();
request.setAny("HelloWorld");
return httpBinClient.post(request);
}
}
示例二:使用基于Spring Security的Feign客户端
@FeignClient(name = CryptoConfigService.FEIGN_CLIENT_NAME, configuration = CryptoConfigFeignClientConfiguration.class)
public interface CryptoConfigFeignClient {
@GetMapping("/get_crypto_info")
CryptoInfoDTO getCryptoInfo(@RequestParam(name = "type") Integer type, @RequestHeader(name = "Authorization") String token);
}
@Configuration
public class CryptoConfigFeignClientConfiguration {
@Autowired
private OAuth2AuthorizedClientService authorizedClientService;
@Bean
public RequestInterceptor oAuth2FeignRequestInterceptor() {
return new OAuth2FeignRequestInterceptor(authorizedClientService);
}
}
上述代码中,我们定义了一个基于Spring Security的Feign客户端。该客户端的主要作用是调用远程服务来获取与加解密密钥相关的信息。在接口中,我们定义了 getCryptoInfo()
方法,同时提供了 Authorization
请求头和 type
请求参数,这些是需要通过Spring Security来处理的。
接下来,我们通过定义Spring Security的配置来获取 OAuth2AuthorizedClientService
,在通过 OAuth2FeignRequestInterceptor
来构建 RequestInterceptor
对象来实现token的传递。
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
private static final String ROLE_NAME = "USER";
@Autowired
private OAuth2AuthorizedClientService authorizedClientService;
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests().anyRequest().hasRole(ROLE_NAME);
}
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.inMemoryAuthentication().withUser("username").password("password").roles(ROLE_NAME);
}
@Bean
public RequestInterceptor oAuth2FeignRequestInterceptor() {
return new OAuth2FeignRequestInterceptor(authorizedClientService);
}
}
上述代码中,我们定义了一个Spring Security的配置 SecurityConfig
。在方法 oAuth2FeignRequestInterceptor()
部分,我们提供了一个用于获取 token 的 OAuth2AuthorizedClientService
对象,这个对象通过构造函数注入来获得。通过重写 configure()
和 configure(AuthenticationManagerBuilder auth)
方法来指定用户账号和密码的信息,并设置用户角色为 USER
。
最后,我们再来测试一下使用基于Spring Security的Feign客户端。这里我们引入了Spring Security,同时调用了远程的加解密服务,这样你就可以更好的理解 Feign 是如何与其他的框架进行集成的。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:一文教你如何使用原生的Feign - Python技术站