1.5分彩平台_Spring Cloud微服务系列文,服务调用框架Feign
- 时间:
- 浏览:0
- 来源:森七博客 - 专注共享张凯博客资讯
已经 博文的案例中,亲戚大伙儿是通过RestTemplate来调用服务,而Feign框架则在此基础上做了一层封装,比如,可不都里能通过注解等依据来绑定参数,因为分析以声明的依据来指定请求返回类型是JSON。 你你这名 “再次封装”能给亲戚大伙儿带来的便利有两点,第一,开发者越多再像使用RestTemplate那样越多地关注HTTP调用细节,第二,在大多数场景里,并全是类型的调用请求会被在多个地方被多次使用,通过Feign能方便地实现相似“重用”。
1 通过案例快速上手Feign
在FeignDemo-Server项目里,搭建基于Eureka的服务器,该项目的端口号是8888,主机名是localhost,启动后,能通过http://localhost:8888/eureka/查看注册到Eureka服务器中的诸多服务提供者或调用者的信息。
在FeignDemo-ServiceProvider项目的控制器类里,亲戚大伙儿提供了一4个多多 sayHello依据,本项目提供服务的端口号是1111,对外提供的application name(服务名)是sayHelloServiceProvider,是向FeignDemo-Server服务器(也是Eureka服务器)的http://localhost:8888/eureka/注册服务。而提供sayHello的依据如下所示,从中,亲戚大伙儿能看多对应的RequestMapping值。
1 @RequestMapping(value = "/hello/{username}", method = RequestMethod.GET )
2 public String sayHello(@PathVariable("username") String username){
3 return "hello " + username;
4 }
上述Eureka服务器和客户端的代码,是复用架构师入门:搭建基本的Eureka架构(从项目里抽取)这篇文章里的代码。
这里亲戚大伙儿将在FeignDemo-ServiceCaller项目里,演示通过Feign调用服务的依据。
第一步,在pom.xml里,引入Eureka、Ribbon和Feign的相关包,关键代码如下。其中,是通过第1行到第9行的代码引入Eureka包,通过第10行到第13行的代码引入Ribbon包,通过第14行到第17行的代码引入Feign包。
1 <dependency> 2 <groupId>org.springframework.boot</groupId> 3 <artifactId>spring-boot-starter-web</artifactId> 4 <version>1.5.4.RELEASE</version> 5 </dependency> 6 <dependency> 7 <groupId>org.springframework.cloud</groupId> 8 <artifactId>spring-cloud-starter-eureka</artifactId> 9 </dependency> 10 <dependency> 11 <groupId>org.springframework.cloud</groupId> 12 <artifactId>spring-cloud-starter-ribbon</artifactId> 13 </dependency> 14 <dependency> 15 <groupId>org.springframework.cloud</groupId> 16 <artifactId>spring-cloud-starter-feign</artifactId> 17 </dependency>
第二步,在application.yml里,通过第3行的代码,定义本项目的名字叫callHelloByFeign,通过第5行的代码,指定本项目是工作在400400端口。一块儿通过第9行的代码,指定本项目是向http://localhost:8888/eureka/ (也却说FeignDemo-Server)你你这名 Eureka服务器注册。
1 spring: 2 application: 3 name: callHelloByFeign 4 server: 5 port: 400400 6 eureka: 7 client: 8 serviceUrl: 9 defaultZone: http://localhost:8888/eureka/
第三步,在启动类里,通过第1行的代码,加进支持Feign的注释,关键代码如下。4个多多多 ,在启动你你这名 Eureka客户端时,就可不都里能引入Feign支持。
1 @EnableFeignClients 2 @EnableDiscoveryClient 3 @SpringBootApplication 4 public class ServiceCallerApp 5 { 6 public static void main( String[] args ) 7 { SpringApplication.run(ServiceCallerApp.class, args); } 8 }
第四步,通过Feign封装客户端调用的细节,内控 模块是通过Feign来调用客户端的,这偏离 的代码是在Controller.java里。
1 省略必要的package和import的代码 2 //通过注解指定待调用的服务名 3 @FeignClient("sayHelloServiceProvider") 4 //在你你这名 接口里,通过Feign封装客户端的调用细节 5 interface FeignClientTool 6 { 7 @RequestMapping(method = RequestMethod.GET, value = "/hello/{name}") 8 String sayHelloInClient(@PathVariable("name") String name); 9 } 10 //Controller是控制器类 11 @RestController 12 public class Controller { 13 @Autowired 14 private FeignClientTool tool; 15 //在callHello依据是,是通过Feign来调用服务 16 @RequestMapping(value = "/callHello", method = RequestMethod.GET) 17 public String callHello(){ 18 return tool.sayHelloInClient("Peter"); 19 } 20 }
在Controller.java你你这名 文件,虽然定义了一4个多多 接口和一4个多多 类。在第5行的FeignClientTool接口里,亲戚大伙儿封装了Feign的调用业务,具体来说,是通过第3行的FeignClient注解,指定了该接口会调用“sayHelloServiceProvider“服务提供者的服务,而通过第8行的,则指定了调用该服务提供者中sayHelloInClient的依据。
而在第12行的Controller类里,先是在第14行里,通过Autowired注解,引入了FeignClientTool类型的tool类,已经 在第17行的callHello依据里,是通过tool类的sayHelloInClient依据,调用了服务提供者的相关依据。
也却说说,在callHello依据里,亲戚大伙儿并那末 再通过RestTemplate,以输入地址和服务名的依据调用服务,却说通过封装入 FeignClientTool(Feign接口)里的依据调用服务。
完成上述代码后,亲戚大伙儿可不都里能通过如下的步骤查看运行效果。
第一步,启动FeignDemo-Server项目,已经 输入http://localhost:8888/,能看多注册到Eureka服务器里的诸多服务。
第二步,启动FeignDemo-ServiceProvider项目,已经 输入http://localhost:1111/hello/Peter,能调用其中的服务,此时,能在浏览里看多“hello Peter”的输出。
第三步,启动FeignDemo-ServiceCaller项目,已经 输入http://localhost:400400/callHello,同样能在浏览里看多“hello Peter”的输出。请注意,这里的调用是通过Feign完成的。
2 通过比较其它调用依据,了解Feign的封装性
在已经 的代码里,亲戚大伙儿是通过如下形式,通过RestTemplate对象来调用服务。
1 RestTemplate template = getRestTemplate();
2 String retVal = template.getForEntity("http://sayHello/hello/Eureka", String.class).getBody();
在第2行的调用中,亲戚大伙儿可不都里能指定url以及返回类型等信息。
已经 亲戚大伙儿还见过基于RestClient对象的调用依据,关键代码如下。
1 RestClient client = (RestClient)ClientFactory.getNamedClient("RibbonDemo");
2 HttpRequest request = HttpRequest.newBuilder().uri(new URI("/hello")).build();
3 HttpResponse response = client.executeWithLoadBalancer(request);
其中是在第1行指定发起调用的RestClient类型的对象,在第2行里指定待调用的目标地址,已经 在第3行发起调用。
这并全是调用依据有着如下的一块儿点:调用时,可不都里能全部地知道各种调用参数,比如服务提供者的url,因为分析有可不都里能通过Ribbon实现负载均衡等机制,也可不都里能在调用时一块儿指定。
但事实上,什么调用依据的底层细节,应该向服务使用者屏蔽,比如在调用时,越多再关注目标url等信息。这就好比某位老板要秘书去订飞机票,作为服务使用者的老板只应当关心调用的结果,比如买到的飞机票是几点开的,该去哪个航站楼登机,至于调用服务的底层细节,比如该到哪个订票网站去买,服务使用者越多再知道。
说得更专业些,这叫“解耦合”,即降低服务调动者和服务提供者之间的耦合度,4个多多多 的好处是,一旦服务提供者改变了实现细节(没改变服务调用接口),那末 服务调用者偏离 的代码越多再改动。
亲戚大伙儿再来回顾下通过Feign调用服务的依据。
1 private FeignClientTool tool; //定义Feign类
2 tool.sayHelloInClient("Peter"); //直接调用
第2行是调用服务,但其中,亲戚大伙儿看不到任何服务提供者的细节,因为分析什么全部回会 第1行引用的FeignClientTool类里封装掉了。也却说说,通过基于Feign的调用依据,开发者能真正地做到“面向业务”,而越多再越多地关注发起调用的细节。
3 通过注解输出调用日志
在开发和调试阶段,亲戚大伙儿希望能看多日志,从而能定位和排查问题图片。这里,亲戚大伙儿将讲述在Feign里输出日志的依据,以便让亲戚大伙儿能在通过Feign调用服务时,看多具体的服务信息。
这里亲戚大伙儿将改写FeignDemo-ServiceCaller项目。
改动点1:在application.yml文件里,增加如下的代码,以开启Feign客户端的DEBUG日志模式,请注意,这里可不都里能指定完成的路径,就像第3行那样。
1 logging:
2 level:
3 com.controller.FeignClientTool: DEBUG
改动点2:在你你这名 项目的启动类ServiceCallerApp.java里,增加定义日志级别的代码,在第7行的feignLoggerLevel依据里,亲戚大伙儿通过第8行的代码,指定了Feign日志级别是FULL。
1 //省略必要的pacakge和import代码 2 @EnableFeignClients 3 @EnableDiscoveryClient 4 @SpringBootApplication 5 public class ServiceCallerApp{ 6 @Bean //定义日志级别是FULL 7 Level feignLoggerLevel() { 8 return Level.FULL; 9 } 10 //启动类 11 public static void main( String[] args ) { 12 SpringApplication.run(ServiceCallerApp.class, args); 13 } 14 }
完成后,依次运行Eureka服务器、服务提供者和服务调用者的启动类,已经 在浏览器里输入http://localhost:400400/callHello,即能在控制台里看多DEBUG级别的日志,下面给出了偏离 输出。
1 2018-06-17 12:18:27.296 DEBUG 208 --- [rviceProvider-2] com.controller.FeignClientTool : [FeignClientTool#sayHelloInClient] ---> GET http://sayHelloServiceProvider/hello/Peter?name=Peter HTTP/1.1
2 2018-06-17 12:18:27.296 DEBUG 208 --- [rviceProvider-2] com.controller.FeignClientTool : [FeignClientTool#sayHelloInClient] ---> END HTTP (0-byte body)
从第1行的输出里,亲戚大伙儿能看多以GET的依据向FeignClientTool类的sayHelloInClient依据发起调用,从第2行的输出里,能看多调用结束。
在上文里,亲戚大伙儿用的是FULL级别的日志,此外,还有NONE、BASIC和HEADERS这并全是,在下表里,亲戚大伙儿将全部讲述各级别日志的输出情况表。
日志输出级别 |
描述 |
NONE |
不输出任何日志 |
BASIC |
只输出请求的依据,请求的URL和相应的情况表码,以及执行的时间 |
HEADERS |
除了会输出BASIC级别的日志外,回会 记录请求和响应的头信息 |
FULL |
输出所有的和请求和响应相关的日志信息 |
一般情况表下,在调试阶段,可不都里能把日志级别设置成FULL,等上线后,可不都里能把级别调整为BASIC,因为分析在生产环境上,越多的日志反而会降低排查和定位问题图片的波特率单位。
4 压缩请求和返回,以提升访问波特率单位
在网络传输过程中,因为分析亲戚大伙儿能降低传输流量,那末 即可提升处理请求的波特率单位。尤其地,在或多或少日常访问量比较高的网络应用中,因为分析能降低处理请求(Request)和发送返回信息(Response)的时间,那末 就能提升本站的吞吐量。
在Feign里,亲戚大伙儿一般能通过如下的配置,来压缩请求和响应。
第一,可不都里能通过在application.yml里增加如下的配置,从而压缩请求和返回信息。
1 feign:
2 compression:
3 request:
4 enabled: true
5 feign:
6 compression:
7 response:
8 enabled: true
其中,前4行是压缩请求,而后4行是压缩返回。
第二,可不都里能通过如下的代码,设置哪类请求(或返回)将被压缩,这里亲戚大伙儿在第4行里,指定了两类格式的请求将被压缩。
1 feign:
2 compression:
3 request:
4 mime-types: text/xml,application/xml
第三,可不都里能通过如下的代码,指定待压缩请求的最小值,这里是2048,也却说说,超过你你这名 值的request才会被压缩。
1 feign:
2 compression:
3 request:
4 min-request-size:2048
本文谢绝转载。其它和Spring Cloud相关的博文如下: