分分飞艇手机客户端_Spring Cloud微服务系列文,服务调用框架Feign

  • 时间:
  • 浏览:8
  • 来源:上海网_专注上海新闻_上海的主流媒体

    日后博文的案例中,我门歌词 歌词 是通过RestTemplate来调用服务,而Feign框架则在此基础上做了一层封装,比如,能非要通过注解等最好的土办法来绑定参数,不可能 以声明的最好的土办法来指定请求返回类型是JSON。    这名“再次封装”能给我门歌词 歌词 带来的便利有两点,第一,开发者不必像使用RestTemplate那样太久地关注HTTP调用细节,第二,在大多数场景里,本身类型的调用请求会被在多个地方被多次使用,通过Feign能方便地实现类似于于于“重用”。

 1 通过案例快速上手Feign

    在FeignDemo-Server项目里,搭建基于Eureka的服务器,该项目的端口号是8888,主机名是localhost,启动后,能通过http://localhost:8888/eureka/查看注册到Eureka服务器中的诸多服务提供者或调用者的信息。

     在FeignDemo-ServiceProvider项目的控制器类里,我门歌词 歌词 提供了一一一两个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的注释,关键代码如下。之后我,在启动这名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这名文件,真是定义了一一一两个接口和一一一两个类。在第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等信息。这就好比某位老板要秘书去订飞机票,作为服务使用者的老板只应当关心调用的结果,比如买到的飞机票是几点开的,该去哪个航站楼登机,至于调用服务的底层细节,比如该到哪个订票网站去买,服务使用者不必知道。

    说得更专业些,这叫“解耦合”,即降低服务调动者和服务提供者之间的耦合度,之后我的好处是,一旦服务提供者改变了实现细节(没改变服务调用接口),那末服务调用者要素的代码不必改动。

    我门歌词 歌词 再来回顾下通过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相关的博文如下:    

猜你喜欢

腾讯5分彩平台登陆_哈德森:本想请队友看西区决赛 无奈被淘汰

一边是前辽篮外援哈腾讯5分彩平台登陆德森效力的腾讯5分彩平台登陆快船队,一边是姚明曾效力的火箭队,昨天进行的NBA西部半决赛抢七大战,无疑是本赛季辽沈球迷关注度最高的一场赛事。

2020-01-29

腾讯2分彩开户网址_爱美:解析脸上下巴长痘痘的原因 教你怎么调理出性感下巴

来源:七丽一个女人网2018-06-0404:58:45  拥有白皙漂亮的下巴,腾讯2分彩开户网址你的每有一个点头、抬头都充满着无限的魅力,但下巴也是一个女人无缘无腾讯2分彩开

2020-01-29

大发快3手机版_面对二孩,母婴智能可解9千万孕妈何痛点?

 两会刚刚刚刚刚开始,留下二孩现象,除了人大代表和政协委员提出的产假延长、二孩家庭补助外,民间的“母婴大发快3手机版智能”创业创新又能对怀胎十月的孕妈做哪2个?两会刚刚刚刚刚开

2020-01-29

2分快3平台登陆_ 卫生间地漏、坐便、洗手盆、排风口,有反味的解决方法

反味的主要来源无非已经 酒店厨房地2分快3平台登陆漏,坐便等,肯能封口不严造成气味上窜。我从事家装比较多,亲戚邻居家前会 过酒店厨房反味的情况表,简单的说一下自己的看2

2020-01-29

秒秒飞艇可靠不_脚踝扭伤后的正确处理办法

在日常生活中秒秒飞艇可靠不,因走路不慎脚踝扭秒秒飞艇可靠不伤是无缘无故 处于的事,扭伤后持续疼痛,非常痛苦,该怎么能否 治疗它呢?今天《生活最好的辦法 网》小编就来讲解一

2020-01-29