一、概述
本文基于Eureka注册服务提供者和消费者,使用Feign、Ribbon、Hystrix实现服务间的调用、负载均衡及服务熔断和降级功能。
二、服务实现步骤
1.创建服务提供者
创建项目普通的SpringBoot项目eureka-provider,在pom.xml文件中增加如下依赖
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies>
在Application主方法上添加@EnableDiscoveryClient注解,启用服务注册功能,向服务注册中心注册本服务
@SpringBootApplication @EnableDiscoveryClient public class EurekaProviderApplication { public static void main(String[] args) { SpringApplication.run(EurekaProviderApplication.class, args); } }
新建HelloWorldController类,对外提供接口服务,本例就实现简单的字符串返回
@RestController public class HelloWorldController { public static Logger logger= LoggerFactory.getLogger(HelloWorldController.class); @RequestMapping("/hello") public String hello() throws InterruptedException { logger.info("---------------hello world!-------------------------"); Thread.sleep(5000); return "hello world!"; } }
修改application.properties配置文件
spring.application.name=eureka-provider server.port=9101 eureka.client.service-url.defaultZone=http://10.17.5.45:9911/eureka/
然后,启动服务,就可以看到注册中心已经注册了该服务
2.创建服务消费者
服务提供者服务已经完成,下面我们创建服务消费者,通过注册中心调用eureka-provider服务,并在eureka-provider不可用时自动降级,返回我们事先定义的内容,以实现系统的高可用。
创建项目普通的SpringBoot项目eureka-consumer,在pom.xml文件中增加如下依赖
<dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-feign</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-hystrix</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies>
在EurekaConsumerApplication主方法上添加@EnableDiscoveryClient注解,启用服务注册功能,向服务注册中心注册本服务,添加@EnableFeignClients,@EnableCircuitBreaker注解,启用负载均衡和hystrix服务降级功能
@EnableCircuitBreaker @EnableFeignClients @EnableDiscoveryClient @SpringBootApplication public class EurekaConsumerApplication { public static void main(String[] args) { SpringApplication.run(EurekaConsumerApplication.class, args); } }
在远程调用eureka-provider服务的时候,可以用原始的RestTemplet和Ribbon去实现http的调用及客户端的负载均衡功能,也可以用feign的声明式的调用,推荐使用feign方式,简单方便又实用。
创建用于feign调用的接口类IHelloWorld,@FeignClient注解定义一个Rest客户端,name属性是需要调用发服务名,由于我们用eureka,系统会自动去服务注册中心查找name为eureka-provider的服务。fallback为服务不可用时的回调方法,有hystrix提供支持。
//@FeignClient("eureka-provider") @FeignClient(name = "eureka-provider",fallback =HelloWorldFallback.class) public interface IHelloWorld { @RequestMapping("/hello") String hello(); }
创建服务不可用时的回调方法HelloWorldFallback
@Component public class HelloWorldFallback implements IHelloWorld { Logger logger= LoggerFactory.getLogger(getClass()); @Override public String hello() { logger.info("服务端调用异常,走服务降级处理!"); return "hello fallback!"; } }
修改配置文件,指定端口号、服务注册中心地址等信息
spring.application.name=eureka-consumer server.port=9102 eureka.client.service-url.defaultZone=http://10.17.5.45:9911/eureka/ #默认情况下,feign是不启动hystrix功能 feign.hystrix.enabled=true
本地启动服务
三、测试
用postman调用接口,正常返回信息如下
为了能看到服务降级的效果,我们在eureka-providr方法里加入 Thread.sleep(5000),手动造成超时的现象,再次调用方法可见,服务降级实现成功
四、小结
demo地址:https://gitee.com/gengkangkang/springcloud.git