刚入门 时,使用 ribbon + hystrix + restTemplate ,实现了简单的 接口访问 + 客户端负载均衡 + 服务熔断保护 ;
然后学习了 feign ,整合了 ribbon + hystrix + restTemplate 的功能优点 并实现了上面功能 ;
上面的是实现服务与服务之间的服务熔断保护。
如今 ,引入了 zuul ,API网关 ,外部用户统一访问zuul服务器,网关拦截请求 并作验证等操作通过后 路由到 指定的 内部 服务器集群 【zuul默认开启客户端负载均衡,类似ribbon】,
那么 ,如果 恰好 路由到的指定服务器时刚好宕机或者线程崩溃了怎么办?或者说当我们的后端服务出现异常的时候,我们不希望将异常抛出给最外层,期望服务可以自动进行降级处理。
这是网关与服务之间的服务熔断保护
Zuul给我们提供了这样的支持。当某个服务出现异常时,直接返回我们预设的信息。【类似于 hystrix 的熔断处理】
2.准备一个服务提供者,端口 8001
目录结构
pom.xml
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>cen.cloud</groupId> <artifactId>cen-mycloud</artifactId> <version>0.0.1-SNAPSHOT</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.example</groupId> <artifactId>provider-8001</artifactId> <version>0.0.1-SNAPSHOT</version> <name>provider-8001</name> <description>Demo project for Spring Boot</description> <properties> <java.version>1.8</java.version> </properties> <dependencies> <!-- spring boot web 组件--> <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> <exclusions> <exclusion> <groupId>org.junit.vintage</groupId> <artifactId>junit-vintage-engine</artifactId> </exclusion> </exclusions> </dependency> <!--eureka 注册中心依赖包 --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> </dependency> <!-- 修改后立即生效,热部署 --> <!-- 热修改后端--> <dependency> <groupId>org.springframework</groupId> <artifactId>springloaded</artifactId> <version>1.2.4.RELEASE</version> </dependency> <!-- 热修改前端--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <!-- <optional>true</optional>--> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>