上一节如何创建一个服务提供者provider已经启动了一个provider的server,提供用户信息查询接口。接下来,我们启动另一个provider,由于是同一台机器本地测试,我们换一个端口
--server.port=8084通过启动传参数覆盖port。这样,我们就有两个provider实例了。接下来,可以使用我们consumer负载均衡的消费这两个provider。
升级eureka依赖eureka之前的pom依赖过期了,需要修改为
spring-cloud-starter-netflix-eureka-server同样的,所有的client都要修改为
spring-cloud-starter-netflix-eureka-client 创建一个consumer工程创建一个子模块。
https://github.com/Ryan-Miao/spring-cloud-Edgware-demo/tree/master/consumer-demo
配置基本和provider一致
<dependencies> <!--springboot 依赖start--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>com.fasterxml.jackson.datatype</groupId> <artifactId>jackson-datatype-jsr310</artifactId> </dependency> <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-openfeign</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-ribbon</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-hystrix</artifactId> </dependency> <!--springboot 依赖结束--> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger2</artifactId> </dependency> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger-ui</artifactId> </dependency> <!--工具类 start--> <dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>net.logstash.logback</groupId> <artifactId>logstash-logback-encoder</artifactId> </dependency> <!--工具类end--> <!--内部依赖--> <dependency> <groupId>com.test</groupId> <artifactId>provider-api</artifactId> <version>0.0.1-SNAPSHOT</version> </dependency> <!--内部依赖end--> </dependencies>spring-cloud-starter-netflix-eureka-client eureka客户端,负责维护注册和心跳
spring-cloud-starter-openfeign 声明式的HttpClient Feign客户端
spring-cloud-starter-netflix-ribbon 客户端负载均衡
spring-cloud-starter-netflix-hystrix http请求健康熔断
provider-api 我们定义好的provider请求的客户端
启动类启动类和provider相同,多了一行注解
@EnableFeignClients @EnableDiscoveryClient @SpringBootApplication public class ConsumerApplication { public static void main(String[] args) { SpringApplication.run(ConsumerApplication.class, args); } }EnableFeignClients 启用Feign
Swagger等基础配置同provider,提供几个简单api。省略叙述。
FeignClient 远程调用创建一个接口,继承我们provider-api里声明的接口
@FeignClient(value = "PROVIDER-DEMO", fallback = UserClientFallback.class) public interface UserClient extends UserApi { }FeignClient会标注这是一个Feign的客户端,在项目启动的时候就会扫描到,value是连接的service的名称,这里即我们的provider, fallback则是当远程请求失败的时候,服务降级,我们来决定做什么。
如果不填写fallback,则请求遇到非200会报错,抛出一个RuntimeException, HystrixRuntimeException. 有可能是远程返回500, 400等,也有可能是连接超时,还有可能是hystrix 熔断。
而填写了fallback, 则会在服务调用失败的时候,转调用我们对应的fallback方法。
fallback就是实现我们这个UserClient接口。
@Component @RequestMapping("/userClientFallback") public class UserClientFallback implements UserClient { @Override public List<UserVo> list() { UserVo userVo = new UserVo(); userVo.setAge(1); userVo.setBirth(LocalDate.now()); userVo.setId(1); userVo.setName("fallback"); return Lists.newArrayList(userVo); } @Override public String fallback() { return "访问失败后调用此方法,进行服务降级."; } }