五大神獸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/**