目录
1.服务熔断2.服务降级3.使用Hystrix服务的熔断,加在被调用的服务中(book)3.1 导入依赖3.2 修改启动类,加@EnableCircuitBreaker注解,标注当前工程开启熔断器3.3 修改controller3.4 测试
4.使用Hystrix服务的降级,加在调用的服务中(user)4.1 导入依赖Hystrix4.2 修改配置文件,开启降级4.3 修改启动类,加入@EnableHystrix,标注当前工程开启服务的降级处理4.4 修改BookClient,加入降级跳转的类fallback = BookFallBackMethod.class4.5 新建BookFallBackMethod 实现BookClient接口,写出降级后续执行的操作4.6 修改UserContoller,注入BookClient ,用它调用4.7 测试
1.服务熔断
服务熔断的作用类似于我们家用的保险丝,当某服务出现不可用或响应超时的情况时,为了防止整个系统出现雪崩,暂时停止对该服务的调用。
2.服务降级
服务降级是从整个系统的负荷情况出发和考虑的,对某些负荷会比较高的情况,为了预防某些功能(业务场景)出现负荷过载或者响应慢的情况,在其内部暂时舍弃对一些非核心的接口和数据的请求,而直接返回一个提前准备好的fallback(退路)错误处理信息。这样,虽然提供的是一个有损的服务,但却保证了整个系统的稳定性和可用性。
3.使用Hystrix服务的熔断,加在被调用的服务中(book)
修改book
3.1 导入依赖
<!-- Hystrix 依赖 熔断降级
-->
<dependency
>
<groupId
>org
.springframework
.cloud
</groupId
>
<artifactId
>spring
-cloud
-starter
-netflix
-hystrix
</artifactId
>
</dependency
>
3.2 修改启动类,加@EnableCircuitBreaker注解,标注当前工程开启熔断器
@SpringBootApplication
@EnableDiscoveryClient
@EnableCircuitBreaker
public class BookSpringBootApplication {
public static void main(String
[] args
) {
SpringApplication
.run(BookSpringBootApplication
.class);
}
}
3.3 修改controller
标注当前接口开启熔断,如果出现问题,走HystrixCommand中的findAllFallBack方法 @HystrixCommand(fallbackMethod = “findAllFallBack”)
@RestController
public class BookController {
@Autowired
BookService bookService
;
@
RequestMapping("/findAll")
@
HystrixCommand(fallbackMethod
= "findAllFallBack")
public List
<BookPojo
> findAll() {
return bookService
.findAll();
}
public List
<BookPojo
> findAllFallBack(){
System
.out
.println("熔断。。。。。");
return null;
}
@
RequestMapping("/findById")
public BookPojo
findById(@RequestBody Map map
){
Integer id
= (Integer
) map
.get("id");
return bookService
.findById(id
);
}
@
RequestMapping("/delete")
public void delete(@RequestBody Map map
){
Integer id
= (Integer
) map
.get("id");
bookService
.delete(id
);
}
@
RequestMapping("/update")
public void update(@RequestBody BookPojo bookPojo
){
bookService
.update(bookPojo
);
}
@
RequestMapping("/insert")
public void insert(@RequestBody BookPojo bookPojo
){
bookService
.insert(bookPojo
);
}
}
3.4 测试
当book的controller的findAll方法出现异常时,控制台直接输出 熔断。。。。。 页面会出现findAllFallBack返回的值。
4.使用Hystrix服务的降级,加在调用的服务中(user)
4.1 导入依赖Hystrix
<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent
>
<artifactId
>springCloud_parent
</artifactId
>
<groupId
>com
.wo
</groupId
>
<version
>1.0-SNAPSHOT</version
>
</parent
>
<modelVersion
>4.0.0</modelVersion
>
<artifactId
>user
</artifactId
>
<dependencies
>
<dependency
>
<groupId
>org
.springframework
.boot
</groupId
>
<artifactId
>spring
-boot
-starter
-web
</artifactId
>
</dependency
>
<!-- eureka 客户端的依赖
-->
<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
>
<!-- Hystrix 依赖 熔断降级
-->
<dependency
>
<groupId
>org
.springframework
.cloud
</groupId
>
<artifactId
>spring
-cloud
-starter
-netflix
-hystrix
</artifactId
>
</dependency
>
<dependency
>
<groupId
>com
.wo
</groupId
>
<artifactId
>pojo
</artifactId
>
<version
>1.0-SNAPSHOT</version
>
</dependency
>
</dependencies
>
</project
>
4.2 修改配置文件,开启降级
server
:
port
: 8083
spring
:
application
:
name
: user
eureka
:
client
:
service
-url
:
defaultZone
: http
://localhost
:8888/eureka
instance
:
#标注当前工程注册时,使用ip地址的方式
prefer
-ip
-address
: true
hostname
: $
{spring
.cloud
.client
.ip
-address
}
instance
-id
: http
://$
{spring
.cloud
.client
.ip
-address
}:$
{server
.port
}
ribbon
:
#ribbon的读取超时时间
ReadTimeout
: 5000
#ribbon的连接超时时间
ConnectTimeout
: 5000
feign
:
hystrix
:
enabled
: true #开启降级
4.3 修改启动类,加入@EnableHystrix,标注当前工程开启服务的降级处理
@SpringBootApplication
@EnableEurekaClient
@EnableFeignClients
@EnableHystrix
public class UserSpringBootApplication {
public static void main(String
[] args
) {
SpringApplication
.run(UserSpringBootApplication
.class);
}
}
4.4 修改BookClient,加入降级跳转的类fallback = BookFallBackMethod.class
@
FeignClient(serviceId
= "book",fallback
= BookFallBackMethod
.class)
public interface BookClient {
@
RequestMapping("/findAll")
public List
<BookPojo
> findAll();
@
RequestMapping("/findById")
public BookPojo
findById(@RequestBody Map map
);
@
RequestMapping("/delete")
public void delete(@RequestBody Map map
);
@
RequestMapping("/update")
public void update(@RequestBody BookPojo bookPojo
);
@
RequestMapping("/insert")
public void insert(@RequestBody BookPojo bookPojo
);
}
4.5 新建BookFallBackMethod 实现BookClient接口,写出降级后续执行的操作
@Component
public class BookFallBackMethod implements BookClient{
@Override
public List
<BookPojo
> findAll() {
System
.out
.println("当前方法调用不到,降级处理!");
return null;
}
@Override
public BookPojo
findById(Map map
) {
return null;
}
@Override
public void delete(Map map
) {
}
@Override
public void update(BookPojo bookPojo
) {
}
@Override
public void insert(BookPojo bookPojo
) {
}
}
4.6 修改UserContoller,注入BookClient ,用它调用
@RestController
@
RequestMapping("/user")
public class UserController {
@Autowired
BookClient bookClient
;
@
RequestMapping("/findAll")
public List
<BookPojo
> findAll(){
return bookClient
.findAll();
}
@
RequestMapping("/findById")
public BookPojo
findById(@RequestBody Map map
){
return bookClient
.findById(map
);
}
@
RequestMapping("/delete")
public void delete(@RequestBody Map map
){
bookClient
.delete(map
);
}
@
RequestMapping("/update")
public void update(@RequestBody BookPojo bookPojo
){
bookClient
.update(bookPojo
);
}
@
RequestMapping("/insert")
public void insert(@RequestBody BookPojo bookPojo
){
bookClient
.insert(bookPojo
);
}
}
4.7 测试
当被调用的服务book关闭之后,控制台打印提示信息当 前方法调用不到,降级处理!