Spring Cloud相关组件的使用简述
一、注册中心:Eureka二、负载均衡:Ribbon二、远程调用:Fegin二、服务熔断:Hystrix
一、注册中心:Eureka,远程调用:Fegin
(一)概念简述:Eureka,提供服务注册,各个微服务可以通过注册中心调用其他微服务的功能接口,包含两个组件EurekaServer、EurekaClient
简单来说,EurekaServe就是提供注册中心的微服务,比如微服务8001通过配置在7001EurekaServer中进行注册,微服务8002通过EurekaClient进行配置来调用8001的功能模块(以下根据这3个微服务进行解释说明)
(二)Eureka实现步骤
1.新建模块7001,引入依赖eureka依赖(springboot、springcloud依赖版本要对应、其他需要的依赖自行引入。我这里父模块版本已经引入了,不会报错。用的是spring boot 2.2.2、spring cloud Hoxton.SR1)
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
2.添加yml配置文件
server:
port: 7001
eureka:
instance:
hostname: eureka7001.com
client:
register-with-eureka: false
fetch-registry: false
service-url:
# 集群模式
# defaultZone: http://eureka7002.com:7002/eureka
# 单机模式
defaultZone: http://eureka7001.com:7001/eureka
3.编写启动类
这里需要加上@EnableEurekaServer注解,表示该服务是注册中心,
@SpringBootApplication
@EnableEurekaServer
public class EurekaMain7001 {
public static void main(String[] args) {
SpringApplication.run(EurekaMain7001.class,args);
}
}
启动服务7001,访问
http://localhost:7001/
如果有画面,说明注册中心配置成功。
4.服务8001注册进7001注册中心
新建微服务8001重复第1步
添加yml文件
server:
port: 8001
# 设置服务名,调用时需要(必须)
spring:
application:
name: cloud-payment-service
eureka:
instance:
hostname: eureka7001.com
client:
register-with-eureka: true
fetch-registry: true
service-url:
# 集群模式
# defaultZone: http://eureka7002.com:7002/eureka
# 单机模式
defaultZone: http://eureka7001.com:7001/eureka
编写启动类
@SpringBootApplication
@EnableEurekaClient
//@EnableDiscoveryClient 不是用的eureka注册中心的可以使用这个注解
public class PaymentMain8001 {
public static void main(String[] args) {
SpringApplication.run(PaymentMain8001.class,args);
}
}
访问http://localhost:7001/,注册成功
(三)Fegin实现步骤(服务9001通过注册中心7001远程调用微服务8001的功能)
1.新建8002
引入openfeign依赖,openfeign服务调用
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
编写yml
server:
port: 9001
spring:
application:
name: cloud-order-openfeign-service
eureka:
client:
register-with-eureka: false
fetchRegistry: true
service-url:
defaultZone: http://eureka7001.com:7001/eureka
主启动类
@SpringBootApplication
@EnableEurekaClient
@EnableFeignClients
public class OrderFeignMain9001 {
public static void main(String[] args) {
SpringApplication.run(OrderFeignMain9001.class,args);
}
}
2.编写8001controller
@RestController
@Slf4j
public class PaymentController {
@GetMapping(value = "/testFeign")
public String testFeign() {
return "这是8001的testFeign";
}
}
2.在9001编写中新建包service中放FeignClient的interface 接口
@Component //加入容器
@FeignClient(value = "CLOUD-PAYMENT-SERVICE") //yml中的8001注册服务的名称
public interface PaymentFeignService {
//复制8001中刚刚编写的需要调用的controller
@GetMapping(value = "/testFeign")
public String testFeign();
}
3.在9001编写中controller注入接口调用目标方法
@RestController
public class OrderController {
@Resource
private PaymentFeignService paymentFeignService;
@GetMapping(value = "/testFeign")
public String testFeign(){
return paymentFeignService.testFeign();
};
}
3.启动微服务7001,8001,8002
访问http://localhost:9001/testFeign
调用成功
二、负载均衡:Ribbon
(一)概念简述:Ribbon是Netflix发布的开源项目,主要功能是提供客户端的负载均衡算法和服务调用。Ribbon客户端组件提供一系完善的配置项如连接超时,重试等。简单的说,就是在配置文件中列出Load Balancer(简称LB)后面所有的机器,Ribbon会自动的助你基于某种规则(如简单轮询,随机连接等)去连接这些机器。
(二)轮询实现步骤
1.新建微服务8002重复8001新建步骤:引入依赖、复制8001的yml端口号改为8002、创建主启动类、创建controller
注意这里的return是 “这是8002的testFeign”;
@RestController
@Slf4j
public class PaymentController {
@GetMapping(value = "/testFeign")
public String testFeign() {
return "这是8002的testFeign";
}
}
2.在9001上加入负载均衡配置类
这里是轮询的负载均衡
其他基于某种规则的配置或者自定义的负载均衡配置可行添加
@Configuration
public class ApplicationContextConfig {
@Bean
@LoadBalanced
public RestTemplate getRestTemplate(){
return new RestTemplate();
}
}
3.启动7001,8001,8002,9001
Eureka中可以看到服务名为CLOUD-PAYMENT-SERVICE有两个
此时再次访问http://localhost:9001/testFeign
每次刷新就可以进行轮询调用8001,8002了
三、断路器:Hystrix
(一)服务降级:如果服务器故障,或者服务器访问时间较长未响应,应该返回一个友好提示,而不是把错误代码返回给用户
1.错误模拟,看看效果
修改8001controller中的testFeign
@GetMapping(value = "/testFeign")
public String testFeign() {
//模拟线程处理时间较长
try {
//休眠三秒,超过
TimeUnit.SECONDS.sleep(3);
} catch (InterruptedException e) {
e.printStackTrace();
}
return "这是8001的testFeign";
}
在9001中的yml中设置调用超时时间
ribbon:
#2秒超时等待
ReadTimeout: 2000
ConnecTimeout: 2000
启动,7001,8001,9001
启动访问http://localhost:9001/testFeign
出现超时错误,返回客户信息,用户体验很差
2.全局的fallback
9001引入hystrix依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
yml开启hystrix支持
feign:
hystrix:
enabled: true
主启动类加入@EnableHystrix注解
@EnableHystrix
@SpringBootApplication
@EnableEurekaClient
@EnableFeignClients
public class OrderFeignMain9001 {
public static void main(String[] args) {
SpringApplication.run(OrderFeignMain9001.class,args);
}
}
在9001的调用的interface中加入PaymentFallbackServiceImpl
编写PaymentFeignService客户端的实现类,调用失败就是执行这个实现类的方法
@Component
public class PaymentFallbackServiceImpl implements PaymentFeignService {
@Override
public String testFeign() {
return "服务器忙,请稍后再试.....";
}
}
FeignClient 接口类
@FeignClient 上加入 fallback 的方法类,调用失败时,会执行PaymentFallbackServiceImpl这个类的对应的方法
@Component
@FeignClient(value = "CLOUD-PAYMENT-SERVICE",fallback = PaymentFallbackServiceImpl.class)
public interface PaymentFeignService {
@GetMapping(value = "/testFeign")
public String testFeign();
}
重启9001测试
调用就会出现我们上面编写的fallback方法。
(二)服务熔断:如果服务器故障,调用服务多次未响应时,不应该继续调用服务器的服务,增加被调用的服务器压力,防止级联故障和雪崩,确保服务端到端的性能
1.8001引入依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
2.8001新增controller
参数id传入小于0的数时会报错,大于的数返回随机的流水号serialNumber
4个参数的value 都可以更改,我这里写的大概意思就是10s内10个请求6个以上的错误就会进行熔断措施
//=====服务熔断
@HystrixCommand(commandProperties = {
@HystrixProperty(name = "circuitBreaker.enabled",value = "true"),// 是否开启断路器
@HystrixProperty(name = "circuitBreaker.requestVolumeThreshold",value = "10"),// 请求次数
@HystrixProperty(name = "circuitBreaker.sleepWindowInMilliseconds",value = "10000"), // 时间窗口期
@HystrixProperty(name = "circuitBreaker.errorThresholdPercentage",value = "60"),// 失败率达到多少后跳闸
})
@GetMapping(value = "/payment/paymentCircuitBreaker/{id}")
public String paymentCircuitBreaker(@PathVariable("id") Integer id){
if(id < 0)
{
throw new RuntimeException("******id 不能负数");
}
//生成随机UUID
String serialNumber = IdUtil.simpleUUID();
return Thread.currentThread().getName()+"\t"+"调用成功,流水号: " + serialNumber;
}
3.8001服务提供者加入@EnableCircuitBreaker注解
@EnableCircuitBreaker
@SpringBootApplication
@EnableDiscoveryClient
public class PaymentMain8001 {
public static void main(String[] args) {
SpringApplication.run(PaymentMain8001.class,args);
}
}
4.参考服务调用的方式,9001客户端FeignClient中加入
调用微服务8001的paymentCircuitBreaker方法
@GetMapping(value = "/payment/paymentCircuitBreaker/{id}")
public String paymentCircuitBreaker(@PathVariable("id") Integer id);
fallback实现类方法
@Override
public String paymentCircuitBreaker(Integer id) {
return "服务器忙,请稍后再试.....";
}
controller调用
@GetMapping(value = "/payment/paymentCircuitBreaker/{id}")
public String paymentCircuitBreaker(@PathVariable("id") Integer id){
return paymentFeignService.paymentCircuitBreaker(id);
}
5.重启8001,9001测试
输入大于0的整数1,正常调用
输入小于0的整数-1,执行fallback方法
上边说了在服务端controller配置的 @HystrixCommand3个参数的大概意思就是10s内10个请求6个以上的错误就会进行熔断措施
所有我们先发送7个错误的请求,参数输入-1
我们再发送3个错误的请求,参数输入1,此时还能正常调用
但是此时已经满足熔断的判断,微服务熔断打开了
再次输入参数输入1,就会执行的fallback方法。
等待一段时间,hystrix会后台自行判断测试,待服务符合要求后,熔断关闭。恢复正常访问
学习:https://www.bilibili.com/video/BV18E411x7eT?p=88
demo源码:https://gitee.com/longdada888/springcloud-demo
更多推荐
所有评论(0)