SpringCloud微服务学习笔记(三)Feign声明式REST客户端

        接着昨天,今天早上起来继续学习了一下springcloud,我在前两篇文章已经总结了,springcloud框架,微服务的发布于调用,以及负载均衡和断路器的内容,也算是一个简单的了解了吧,但是,我在记录过程中,一直在嫌弃那种编码的方式,又得配置eureka,又得配置ribbon,还得配置hystrix,虽然配置很简单吧,但总是觉得,这样搞有点繁琐。今天继续往下看的时候,看到了,SpringCloud的另外一个组件:Feign声明式REST客户端。
        Feign,这个组件集成封装了Ribbon和Hystrix。我们在想要使用Ribbon和Hystrix的时候,只需要导入依赖,然后编写接口,在接口上加上注解就可以了,这个接口中的方法,和服务提供方的接口中的方法一一对应,我们可以通过接口上的注解添加服务id,然后使用SpringMVC中的@RequestMapping等注解指定接口中方法的访问路径和请求方式等,这个路径和服务提供方的也是一一对应的,如果不对应就会报异常,为什么可以使用@RequestMapping这些注解?这是因为Feign为了降低学习的门槛,继承了沿用了SpringMVC中的这些注解。
        这种开发方式,就让我联想到了Apache CXF(webservice框架)和Dubbo这两个框架的开发模式,他们也是可以通过注解指定服务的id和请求方式,服务消费者只需要保证具有和服务提供方一模一样的接口就可以了,而接口的实现是在服务的提供方来做的。
        这里来个总结吧,总结一下Feign作为服务消费方是如何实现访问远程服务的。
        1.作为服务消费方,需要有一个和服务提供方一模一样的的接口。接口的实现在服务提供方。
        2.然后接口上要加上@FeignClient注解,这个注解可以指定服务的名称。
        3.在接口的方法上指定远程服务方法的访问路径和请求方式等。
        4.最后一步就是启动测试了。

        废话这么多主要是想先讲清楚它的调用过程。因为我在跟着文档看的时候,也是云里雾里,最后按照自己的理解测了一遍,果然跟我想的一模一样。好了不废话了,下边就介绍一下Feign的使用吧。

1.Feign声明式REST客户端

        Feign是一个声明式的Web服务客户端。这使得Web服务客户端的写入更加方便,Spring Cloud为Feign增加了对Spring MVC注释的支持,并使用Spring Web中默认使用的HttpMessageConverters。Spring Cloud集成Ribbon和Eureka以在使用Feign时提供负载均衡的http客户端。这是官方文档的一段简介。SpringCloud中文官方文档

1.1Feign集成Ribbon实现服务的调用

1.1.1新建一个springcloud-feign项目并导入Feign的依赖

        我们首先需要新建一个springcloud-feign的项目导入一些依赖。这里我们还需要导入eureka依赖,因为要把项目注册到eureka服务器,而且,eureka也集成了ribbon依赖。之后也会用到。

		<!-- Feign依赖 -->
		<dependency>
		    <groupId>org.springframework.cloud</groupId>
		    <artifactId>spring-cloud-starter-openfeign</artifactId>
		    <version>2.0.2.RELEASE</version>
		</dependency>
		<!-- eureka依赖 -->
		<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>
				spring-cloud-starter-netflix-eureka-client
			</artifactId>
			<version>2.1.1.RELEASE</version>
		</dependency>
1.1.2添加@EnableFeignClients注解

        老规矩,还是在springboot启动类上添加注解,这个注解的作用是启用feign客户端。如下图:
SpringCloud微服务学习笔记(三)Feign声明式REST客户端_第1张图片

1.1.2编写Feign接口

        项目准备好之后,我们还需要编写一个Feign接口。这个接口中需要声明一些你想要带调用的服务的方法。方法上要通过SpringMVC的一些注解声明访问路径和请求方式等。在接口上也需要加一个注解@FeignClient,这个注解可以指定服务的名称和访问的url等。如下图,我编写了一个Feign接口,调用服务id为springcloud-02的访问路径为/test/feign/{from}/{msg}的方法。
在这里插入图片描述

1.1.3编写Controller,测试我们的调用是否成功

        这里就是简单的为我们的springcloud-feign项目编写一个Controller,将Feign接口注入,通过浏览器访问看看是否能够成功调用远程服务。如下图:
SpringCloud微服务学习笔记(三)Feign声明式REST客户端_第2张图片
        在springcloud-02中我已经准备好了一个方法。如下图:
在这里插入图片描述

1.1.4启动测试

        如果不出意外,就可以访问成功,记住,Feign接口中的路径一定要和远程方法的路径一致,否则是访问不到服务的。访问成功如下图:
SpringCloud微服务学习笔记(三)Feign声明式REST客户端_第3张图片

1.1.5Feign集成Ribbon实现负载均衡

        这里就特别爽了,不需要我们进行任何配置,因为Feign已经默认开启了负载均衡和超时重试的机制。如果我们需要特别的配置,配置超时时间、读取超时时间和重试次数等,我们可以直接在yml文件中进行配置,如下图:

ribbon:
  ConnectTimeout: 1000
  ReadTimeout: 1000

1.2Feign集成Hystrix实现降级

配置

        这里就难了,因为Feign中没有为我们开启降级配置,因此我们需要自己配置,配置如下:

feign:
  hystrix:
    enabled: true
准备降级类

        使用Feign之后,我们就不在写降级方法了,而是需要写降级类,这个降级类实现了我们的Feign接口,我们的降级代码就写在每一个实现的方法中,这些方法就是降级方法。如下图,我为我的Feign接口准备了一个降级类,并把它交给Spring管理,对了,这里一定要交给Sping管理,不然项目会启动不起来。我使是@Component注解,当然你也可以用@Service注解,都一样。
SpringCloud微服务学习笔记(三)Feign声明式REST客户端_第4张图片
        然后我们需要在接口中指定一下我们的降级类。通过@FeignClient注解的fallback属性指定降级类的字节码对象即可。如下图:
SpringCloud微服务学习笔记(三)Feign声明式REST客户端_第5张图片

测试

        然后我们在模拟请求失败,测试一下,我把springcloud-02项目给关闭了。然后我们开始测试,如下图:
SpringCloud微服务学习笔记(三)Feign声明式REST客户端_第6张图片
        测试成功。
        今天就这些吧。

你可能感兴趣的:(框架)