五大神兽java
说明 | 组件 |
---|---|
服务治理 | Eureka |
负载均衡 | Ribbon |
服务调用 | Feign |
服务熔断与降级 | hystrix |
路由网关 | Zuul |
配置中心 | config |
导包git
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> </dependency>
主启动类开启Eureka服务spring
@EnableEurekaServer服务器
@EnableEurekaServer @SpringBootApplication public class TsEurekaApplication { public static void main(String[] args) { SpringApplication.run(TsEurekaApplication.class, args); } }
编写配置文件app
server.port=8761 # 是否向服务器注册本身 eureka.client.register-with-eureka=false # 是否获取服务列表 eureka.client.fetch-registry=false #Eureka的服务地址 eureka.client.service-url.defaultZone=http://127.0.0.1:8761/eureka/
访问http://127.0.0.1:8761/ 便可看到Eureka的监控页面负载均衡
导包ide
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency>
主启动类开启Eureka客户端fetch
@EnableEurekaClientui
@EnableEurekaClient @SpringBootApplication @RestController public class TsProvider8001Application { public static void main(String[] args) { SpringApplication.run(TsProvider8001Application.class, args); } @RequestMapping("/a") public HashMap<String,String> a() { HashMap<String, String> map = new HashMap<>(); map.put("name","服务提供者->集群8001号"); return map; } }
编写配置文件url
spring.application.name=provider server.port=8001 # 注册到http://127.0.0.1:8761/eureka/ eureka.client.service-url.defaultZone=http://127.0.0.1:8761/eureka/ eureka.instance.prefer-ip-address=true
使用 @LoadBalanced
Eureka内已经集成了Ribbon不须要额外导包
@Bean @LoadBalanced public RestTemplate getRestTemplate() { return new RestTemplate(); }
负载均衡策略
轮询(默认) 随机 权重 ···
IRule接口的实现类
导包
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> <version>3.0.0</version> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-feign</artifactId> <version>1.4.7.RELEASE</version> </dependency>
主启动类开启Feign支持
@EnableFeignClients
@SpringBootApplication @EnableFeignClients @EnableEurekaClient public class TsConsumerApplication { public static void main(String[] args) { SpringApplication.run(TsConsumerApplication.class, args); } }
向Eureka注册
server.port=8080 spring.application.name=consumer eureka.client.service-url.defaultZone=http://127.0.0.1:8761/eureka/
使用
provider为访问提供者的名称
@FeignClient(value = "provider") public interface InfoService { @RequestMapping("/a") public Map<String ,String> getInfo(); }
此时,调用此接口的方法至关于远程调用:http://provider/a
导包
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-hystrix</artifactId> <version>2.2.6.RELEASE</version> </dependency>
主启动类添加熔断支持
@EnableCircuitBreaker
@SpringBootApplication @EnableFeignClients @EnableCircuitBreaker @EnableEurekaClient public class TsConsumerApplication { public static void main(String[] args) { SpringApplication.run(TsConsumerApplication.class, args); } }
编写业务
fallback = MyFallback.class 就是服务降级到MyFallback
还有一个fallbackFactory,实现FallbackFactory能够返回错误信息
@FeignClient(value = "provider", fallback = MyFallback.class) public interface InfoService { @RequestMapping("/a") public Map<String ,String> getInfo(); }
MyFallback:
@Component public class MyFallback implements InfoService { @Override public Map<String, String> getInfo() { HashMap<String, String> map = new HashMap<>(); map.put("name","出现异常"); return map; } }
导包
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-zuul</artifactId> <version>2.2.0.RELEASE</version> </dependency>
主启动类添加路由支持
@EnableZuulProxy
@EnableDiscoveryClient//@EnableEurekaClient @EnableZuulProxy @SpringBootApplication public class TsGatewayApplication { public static void main(String[] args) { SpringApplication.run(TsGatewayApplication.class, args); } }
配置
#端口 server.port=80 spring.application.name=zuul eureka.client.register-with-eureka=true eureka.client.fetch-registry=true eureka.client.service-url.defaultZone=http://localhost:8761/eureka/ eureka.instance.prefer-ip-address=true # 取消全部的默认服务地址 zuul.ignored-services=* # 将consumer服务映射为ts/** zuul.routes.consumer=/ts/**