Spring Cloud微服务实践

Spring Cloud Feign声明式服务消费

Feign是什么

Feign是Netflix公司开发的一个声明式的REST调用客户端;

Ribbon负载均衡、Hystrix服务熔断是我们Spring Cloud中进行微服务开发非常基础的组件,在使用的过程中我们也发现它们一般都是同时出现的,而且配置也都非常相似,每次开发都有很多相同的代码,因此Spring Cloud基于Netflix Feign整合了Ribbon和Hystrix两个组件,让我们的开发工作变得更加简单,就像Spring Boot是对Spring+SpringMVC的简化一样,Spring Cloud Feign对Ribbon负载均衡、Hystrix服务熔断进行简化,在其基础上进行了进一步的封装,不仅在配置上大大简化了开发工作,同时还提供了一种声明式的Web服务客户端定义方式;

使用Feign实现消费者

使用Feign实现消费者,我们通过下面步骤进行:

第一步:创建普通Spring Boot工程

首先我们来创建一个普通的Spring Boot工程,取名为:05-springcloud-service-feign;

第二步添加依赖

要添加的依赖主要是spring-cloud-starter-netflix-eureka-client和spring-cloud-starter-feign,如下:

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-feign</artifactId>
    <version>1.4.5.RELEASE</version>
</dependency>
<!--Spring Cloud熔断器起步依赖-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-hystrix</artifactId>
    <version>1.4.5.RELEASE</version>
</dependency>

第三步:添加注解

在项目入口类上添加@EnableFeignClients注解表示开启Spring Cloud Feign的支持功能;

第四步声明服务

定义一个HelloService接口,通过@FeignClient注解来指定服务名称,进而绑定服务,然后再通过SpringMVC中提供的注解来绑定服务提供者提供的接口,如下:

@FeignClient("01-springcloud-service-provider")
public interface HelloService {
    @RequestMapping("/service/hello")
    public String hello();
}

这相当于绑定了一个名叫01-springcloud-service-provider (这里01-springcloud-service-provider大小写01-SPRINGCLOUD-SERVICE-PROVIDER都可以 ) 的服务提供者提供的/service/hello接口;

我们服务提供者提供的接口如下:

@GetMapping("/service/hello")
public String hello() {
    System.out.println("服务提供者1。。。。。。。");
    return "Hello, Spring Cloud,Provider 1";
}

第五步使用Controller中调用服务

接着来创建一个Controller来调用上面的服务,如下:

@RestController
public class FeignController {
    @Autowired
    HelloService helloService;
    @RequestMapping("/web/hello")
    public String hello() {
        return helloService.hello();
    }
}

第六步:属性配置

在application.properties中指定服务注册中心、端口号等信息,如下:

server.port=8082
#配置服务的名称
spring.application.name=05-springcloud-service-feign
#配置eureka注册中心地址
eureka.client.service-url.defaultZone=http://eureka8761:8761/eureka/,http://eureka8762:8762/eureka/

第七步测试

依次启动注册中心、服务提供者和feign实现服务消费者,然后访问如下地址:http://localhost:8082/web/hello。

使用Feign实现消费者的测试

之前我们为了简化RestTemplate操作,将之封装在一个BookService中,但同时我们也发现BookService中的方法几乎都是模板式的,写起来很枯燥,Spring Cloud Feign对此进行了进一步的封装,简化了我们的封装操作。

Feign的基本使用,在HelloService类中声明接口时,我们发现这里的代码可以直接从服务提供者的Controller中复制过来,这些可以复制的代码Spring Cloud Feign对它进行了进一步的抽象,这里就用到了Feign的继承特性,Feign继承特性的方便之处了,这种方式用起来确实很方面,但是也带来一个问题,就是服务提供者和服务消费者的耦合度太高,此时如果服务提供者修改了一个接口的定义,服务消费者可能也得跟着变化,进而带来很多未知的工作量,因此小伙伴们在使用继承特性的时候,要慎重考虑。

全部教程