springcloud(七)-Feign声明式REST调用
前言
前面我們使用的RestTemplate實現REST API調用,代碼大致如下:
public User findById(@PathVariable Long id) {return restTemplate.getForObject("http://localhost:8084/" + id, User.class);}由代碼可知,我們是使用拼接字符串的方式構造URL的,該URL只有一個參數。但是,在現實中,URL中往往含有多個參數。這時候我們如果還用這種方式構造URL,那么就會非常痛苦。舉個例子:
http://localhost:8010/search?name=zhangsan&username=account1&age=20
這里是有三個參數,要是有10個參數,那么代碼會變得難以維護。
怎么解決?
Feign簡介
Feign是Netflix開發的聲明式,模板化的HTTP客戶端,其靈感來自Retrofit,JAXRS-2.0以及WebSocket.Feign可幫助我們更加便捷,優雅的調用HTTP API。
在spring cloud中,使用Feign非常簡單——創建一個接口,并在接口上添加一些注解,代碼就完成了。Feign支持多種注解,例如Feign自帶的注解或者JAX-RS注解等。
spring cloud對Feign進行了增強,使Feign支持了springmvc注解,并整合了Ribbon和Eureka,從而讓Feign的使用更加方便。
代碼編寫
1.我們復制前面的microservice-consumer-movie,將ArtifactId修改為microservice-consumer-movie-feign.
2.添加Feign的依賴。
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId> </dependency>3.創建一個Feign接口,并添加@FeignClient注解。
@FeignClient("microservice-provider-user") public interface UserFeignClient {@RequestMapping(value="/{id}",method = RequestMethod.GET)public User findById(@PathVariable("id") Long id); }這里解釋一下:@FeignClient注解中的microservice-provider-user是一個任意的客戶端名稱,用于創建Ribbon負載均衡器。在本例中,使用了Eureka,所以Ribbon會把microservice-provider-user解析成Eureka Server服務注冊表中的服務。
當然,你也可以使用url屬性指定請求URL(URL可以是完整的URL或者主機名),例如:
@FeignClient(name="microservice-consumer-user",url="http://localhost:8000/")
4.修改Controller代碼,讓其調用Feign接口。
@RestController public class MovieController { // @Autowired // private RestTemplate restTemplate; @Autowiredprivate UserFeignClient userFeignClient;@GetMapping("/user/{id}")public User findById(@PathVariable Long id) { // return restTemplate.getForObject("http://localhost:8081/" + id, User.class);return userFeignClient.findById(id);} }5.修改啟動類,為其添加@EnableFeignClients注解,如下:
@SpringBootApplication @EnableFeignClients public class ConsumerMovieApplication {@Beanpublic RestTemplate restTemplate() {return new RestTemplate();}public static void main(String[] args) {SpringApplication.run(ConsumerMovieApplication.class, args);} }這樣,我們的電影微服務就可以用Feign去調用用戶微服務的API了。
測試
啟動microservice-discovery-eureka.
啟動2個或更多microservice-provider-user實例。
啟動microservice-consumer-movie-feign.
多次訪問http://localhost:8082/user/1,返回結果。
{"id":1,"username":"account1","name":"張三","age":20,"balance":98.23}兩個用戶微服務實例都會打印如下日志:
Hibernate: select user0_.id as id1_0_0_, user0_.age as age2_0_0_, user0_.balance as balance3_0_0_, user0_.name as name4_0_0_, user0_.username as username5_0_0_ from user user0_ where user0_.id=? 2019-04-19 19:23:42.249 TRACE 7464 --- [nio-8084-exec-7] o.h.type.descriptor.sql.BasicBinder : binding parameter [1] as [BIGINT] - [1] 2019-04-19 19:23:42.251 TRACE 7464 --- [nio-8084-exec-7] o.h.type.descriptor.sql.BasicExtractor : extracted value ([age2_0_0_] : [INTEGER]) - [20] 2019-04-19 19:23:42.251 TRACE 7464 --- [nio-8084-exec-7] o.h.type.descriptor.sql.BasicExtractor : extracted value ([balance3_0_0_] : [NUMERIC]) - [98.23] 2019-04-19 19:23:42.251 TRACE 7464 --- [nio-8084-exec-7] o.h.type.descriptor.sql.BasicExtractor : extracted value ([name4_0_0_] : [VARCHAR]) - [張三] 2019-04-19 19:23:42.251 TRACE 7464 --- [nio-8084-exec-7] o.h.type.descriptor.sql.BasicExtractor : extracted value ([username5_0_0_] : [VARCHAR]) - [account1]以上結果說明,我們不但實現了聲明式REST API調用,同時還實現了客戶端側的負載均衡。
?
代碼下載地址:https://gitee.com/fengyuduke/my_open_resources/blob/master/microservice-consumer-movie-feign.zip
?
轉載于:https://www.cnblogs.com/fengyuduke/p/10738342.html
總結
以上是生活随笔為你收集整理的springcloud(七)-Feign声明式REST调用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: leetcode 994.腐烂的橘子
- 下一篇: 楼舒婉是穿越的吗(宁毅没注意到2细节证明