springcloud(七)-Feign声明式REST调用
前言
前面我們使用的RestTemplate實(shí)現(xiàn)REST API調(diào)用,代碼大致如下:
public User findById(@PathVariable Long id) {return restTemplate.getForObject("http://localhost:8084/" + id, User.class);}由代碼可知,我們是使用拼接字符串的方式構(gòu)造URL的,該URL只有一個(gè)參數(shù)。但是,在現(xiàn)實(shí)中,URL中往往含有多個(gè)參數(shù)。這時(shí)候我們?nèi)绻€用這種方式構(gòu)造URL,那么就會(huì)非常痛苦。舉個(gè)例子:
http://localhost:8010/search?name=zhangsan&username=account1&age=20
這里是有三個(gè)參數(shù),要是有10個(gè)參數(shù),那么代碼會(huì)變得難以維護(hù)。
怎么解決?
Feign簡介
Feign是Netflix開發(fā)的聲明式,模板化的HTTP客戶端,其靈感來自Retrofit,JAXRS-2.0以及WebSocket.Feign可幫助我們更加便捷,優(yōu)雅的調(diào)用HTTP API。
在spring cloud中,使用Feign非常簡單——?jiǎng)?chuàng)建一個(gè)接口,并在接口上添加一些注解,代碼就完成了。Feign支持多種注解,例如Feign自帶的注解或者JAX-RS注解等。
spring cloud對Feign進(jìn)行了增強(qiáng),使Feign支持了springmvc注解,并整合了Ribbon和Eureka,從而讓Feign的使用更加方便。
代碼編寫
1.我們復(fù)制前面的microservice-consumer-movie,將ArtifactId修改為microservice-consumer-movie-feign.
2.添加Feign的依賴。
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId> </dependency>3.創(chuàng)建一個(gè)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是一個(gè)任意的客戶端名稱,用于創(chuàng)建Ribbon負(fù)載均衡器。在本例中,使用了Eureka,所以Ribbon會(huì)把microservice-provider-user解析成Eureka Server服務(wù)注冊表中的服務(wù)。
當(dāng)然,你也可以使用url屬性指定請求URL(URL可以是完整的URL或者主機(jī)名),例如:
@FeignClient(name="microservice-consumer-user",url="http://localhost:8000/")
4.修改Controller代碼,讓其調(diào)用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.修改啟動(dòng)類,為其添加@EnableFeignClients注解,如下:
@SpringBootApplication @EnableFeignClients public class ConsumerMovieApplication {@Beanpublic RestTemplate restTemplate() {return new RestTemplate();}public static void main(String[] args) {SpringApplication.run(ConsumerMovieApplication.class, args);} }這樣,我們的電影微服務(wù)就可以用Feign去調(diào)用用戶微服務(wù)的API了。
測試
啟動(dòng)microservice-discovery-eureka.
啟動(dòng)2個(gè)或更多microservice-provider-user實(shí)例。
啟動(dòng)microservice-consumer-movie-feign.
多次訪問http://localhost:8082/user/1,返回結(jié)果。
{"id":1,"username":"account1","name":"張三","age":20,"balance":98.23}兩個(gè)用戶微服務(wù)實(shí)例都會(huì)打印如下日志:
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]以上結(jié)果說明,我們不但實(shí)現(xiàn)了聲明式REST API調(diào)用,同時(shí)還實(shí)現(xiàn)了客戶端側(cè)的負(fù)載均衡。
?
代碼下載地址:https://gitee.com/fengyuduke/my_open_resources/blob/master/microservice-consumer-movie-feign.zip
?
轉(zhuǎn)載于:https://www.cnblogs.com/fengyuduke/p/10738342.html
總結(jié)
以上是生活随笔為你收集整理的springcloud(七)-Feign声明式REST调用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: leetcode 994.腐烂的橘子
- 下一篇: Dijkstra算法——计算一个点到其他