滨州的网站建设,成都百度竞价推广,怎么自己做网站的推广,网站建设小白到精通需要文章目录负载均衡RibbonRibbon的作用代码实现生产者cloud1_provider实现配置文件在HiController中编写以下代码启动集群消费者cloud1_consumer实现引入依赖编写配置文件编写启动类#xff0c;并给RestTemplate配置LoadBalanced注解编写RestController来测试Feign负载均衡简介F…
文章目录负载均衡RibbonRibbon的作用代码实现生产者cloud1_provider实现配置文件在HiController中编写以下代码启动集群消费者cloud1_consumer实现引入依赖编写配置文件编写启动类并给RestTemplate配置LoadBalanced注解编写RestController来测试Feign负载均衡简介FeignFeign集成了RIbbon编码测试基于cloud1_consumer项目修改引入依赖启用FeignClient编写FeignService接口编写Controller测试使用Hystrix服务熔断分布式系统面临问题——服务雪崩什么是Hystrix断路器作用服务熔断HystrixCommand服务熔断与服务降级服务熔断代码案例引入依赖启用断路器编写带有短路方法的测试Controller服务降级代码案例基于之前搭建的cloud1_consumer项目修改引入依赖编写yml配置编写Feign接口编写降级回调工厂类 OrderServiceFallBackFactory编写测试ControllerHystrix流监控Dashboard代码案例生产侧被监测方依赖配置与代码监控客户端依赖配置与代码cloud1_hystrix_dashboard负载均衡Ribbon
SpringCloudRibbon是基于NetflixRibbon实现的一套客户端负载均衡工具。主要功能是提供客户端的负载均衡算法。Ribbon客户端提供系列完整的配置如连接超市重试机制。简单说就是在配置文件中列出LoadBalancer后面的所有机器。Ribbon会自动帮助基于某种规则轮询、随机去连接机器。
Ribbon的作用
LBLoad Balance负载均衡在微服务或分布式集群中常用的一种应用负载均衡简单来说就是平摊用户请求到多个赴俄乌从而达到系统的HA高可用常见负载均衡软件Nginx、LVSDubbo、SpringCloud中均给我们提供了负载均衡。SpringCloud负载均衡算法可以自定义负载均衡简单分类 集中式Load Balance 即在服务端消费方和提供方之间使用独立的LB设施如Nginx由该服务负责把访问请求通过负载策略转发到服务提供方进程式Load Balance 将LB的逻辑集成到消费者消费者从服务注册中心获取到有哪些地址可用然后自己再根据这些地址选举出一个合适的服务器。Ribbon就属于进程式LB他是一个类库。集成于消费者进程消费者通过它来获取到服务提供者的地址。
代码实现
基于前面的代码来改造服务提供者的代码先搭建服务提供者的集群
生产者cloud1_provider实现
配置文件
spring:profiles:active: dev-9991---
server:port: 9991
spring:config:activate:on-profile: dev-9991application:name: cloud1-provider
logging:level:com.hx: debug
eureka:client:service-url:defaultZone: http://localhost:8881/eureka/,http://localhost:8882/eureka/instance:instance-id: cloud-prod-1# 配置主机地址hostname: localhost---
server:port: 9992
spring:config:activate:on-profile: dev-9992application:name: cloud1-provider
logging:level:com.hx: debug
eureka:client:service-url:defaultZone: http://localhost:8881/eureka/,http://localhost:8882/eureka/instance:instance-id: cloud-prod-2# 配置主机地址hostname: localhost在HiController中编写以下代码
Value(${server.port})
private String port;RequestMapping(/)
public String hi() {return h1HI Spring Cloud 1 port /h1;
}启动集群 消费者cloud1_consumer实现
引入依赖
注意这里不需要重复引入ribbon的依赖否则无法ribbon将获取不到实例
?xml version1.0 encodingUTF-8?project xmlnshttp://maven.apache.org/POM/4.0.0 xmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsdparentartifactIdcloud1_parent/artifactIdgroupIdcom.hx/groupIdversion1.0-SNAPSHOT/version/parentmodelVersion4.0.0/modelVersionartifactIdcloud1_consumer/artifactIdnamecloud1_consumer/namepropertiesproject.build.sourceEncodingUTF-8/project.build.sourceEncodingmaven.compiler.source1.7/maven.compiler.sourcemaven.compiler.target1.7/maven.compiler.target/propertiesdependenciesdependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-starter-netflix-eureka-client/artifactId/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId/dependencydependencygroupIdcom.hx/groupIdartifactIdcloud1_api/artifactIdversion0.0.1-SNAPSHOT/version/dependency/dependencies
/project编写配置文件
server:port: 7771
spring:application:name: cloud1-consumer
logging:level:com.hx: debug
eureka:client:service-url:defaultZone: http://localhost:8881/eureka/,http://localhost:8882/eureka/register-with-eureka: false # 消费者不需要注册自己instance:instance-id: cloud-prod-1# 配置主机地址hostname: localhost编写启动类并给RestTemplate配置LoadBalanced注解
SpringBootApplication
EnableEurekaClient
public class Cloud1ConsumerApp {public static void main(String[] args) {SpringApplication.run(Cloud1ConsumerApp.class,args);}// 配置负载均衡的restTemplateBeanLoadBalanced // ribbonpublic RestTemplate restTemplate(){return new RestTemplate();}
}编写RestController来测试
RestController
public class RestOrderController {Autowiredprivate RestTemplate restTemplate;private static final String ORDER_APP_URI http://CLOUD1-PROVIDER;RequestMapping(/)public String index() {return restTemplate.getForObject(ORDER_APP_URI.concat(/), String.class);}RequestMapping(/restOrder)public Order getOrder() {return restTemplate.getForObject(ORDER_APP_URI.concat(/getOrder), Order.class);}
}Feign负载均衡
简介Feign
Feign是声明式的web service客户端。让微服务之间的调用更简单类似controller调用service。SpringCloud继承了Ribbon和Eureka可以在使用Feign时提供负载均衡的http客户端。Feign旨在使得编写JavaHttp客户端简单容易。 只需要给一个接口然后添加注解就可以。
Feign集成了RIbbon
利用Ribbon维护了微服务列表信息通过轮询实现了客户端的负载均衡而与Ribbon不同的是通过Feign只需要定义服务绑定接口且以声明式的方法优雅简单的实现服务调用。
编码测试基于cloud1_consumer项目修改
引入依赖
dependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-starter-feign/artifactIdversion1.4.7.RELEASE/version
/dependency启用FeignClient
SpringBootApplication
EnableEurekaClient
//EnableFeignClients
EnableFeignClients(basePackages com.hx.service)
public class Cloud1ConsumerApp {public static void main(String[] args) {SpringApplication.run(Cloud1ConsumerApp.class, args);}// 配置负载均衡的restTemplateBeanLoadBalanced // ribbonpublic RestTemplate restTemplate() {return new RestTemplate();}
}编写FeignService接口
Service
FeignClient(value CLOUD1-PROVIDER)
public interface RestOrderService {GetMapping(/)String index();PostMapping(/getOrder)Order restGetOrder();
}编写Controller测试使用
RestController
RequestMapping(/fg)
public class RestOrderFeignController {Autowiredprivate RestOrderService restOrderService;RequestMapping(/)public String index() {return restOrderService.index();}RequestMapping(/restOrder)public Order getOrder() {return restOrderService.restGetOrder();}
}Hystrix服务熔断
分布式系统面临问题——服务雪崩
复杂分布式体系结构中应用程序有数十个依赖关系每个依赖关系在某些时刻不可避免的失败。 多个微服务之间调用的时候假设A服务调用B、C服务微服务B和C又调用其他微服务这就是所谓的扇出。如果扇出的链路上某个微服务的调用响应超市或时间过长无响应对微服务A的调用就会占用越来越多的系统资源进而引发系统崩溃即服务雪崩。 对于高流量应用单一的后端依赖可能导致所有服务上的所有资源都在几十秒内饱和。更糟糕的是这些应用还可能导致服务之间的延迟增加备份队列线程和其他系统资源紧张导致整个系统发生更多的级联腹胀。这些都表示需要对故障和延迟进行隔离和管理以便单个依赖关系的失败不取消整个应用程序系统。
什么是Hystrix断路器
Hystrix是一个应用于处理分布式系统的延迟和容错开源库在分布式系统中许多依赖不可避免的调用失败eg超时、异常等。Hystrix能够保证在一个依赖出问题的情况下不会导致整体服务失败避免级联故障提高分布式系统的弹性。 断路器本身是一种开关当某个服务单元发生故障后通过断路器的故障监控向服务调用方返回一个服务预期的、可处理的备选响应而不是长时间的等待或者抛出无法处理的异常这样保证了服务调用方的线程不会被长时间占用。从而避免故障在分布式系统中的蔓延乃至雪崩。
作用
服务降级、服务熔断、服务限流、接近实时监控
服务熔断HystrixCommand
熔断机制是应对雪崩问题的一种微服务链路保护机制。 当扇出的某个微服务不可用或者响应时间太长会进行服务降级进而熔断该节点微服务调用快速返回错误的相应细腻些。当检测到该服务响应正常后恢复链路调用。在SpringCloud熔断机制通过Hystrix实现。Hystrix会监控微服务间调用的状况当失败的调用到达一定阈值缺省5s内20次失败就会启动熔断机制。
服务熔断与服务降级
服务熔断服务端编写某个服务超时或者异常引起熔断 服务降级客户端编写从整体的网站请求负载考虑当某个服务熔断或者关闭后服务将不再被调用。此时在客户端可以准备一个失败回调FallbackFactory。返回一个默认的缺省值整体服务水平下降。
服务熔断代码案例
引入依赖
dependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-starter-netflix-hystrix/artifactIdversion2.1.0.RELEASE/version
/dependency启用断路器
SpringBootApplication
EnableDiscoveryClient // 服务发现不只是eureka
//EnableCircuitBreaker // 启用断路器Hystrix
EnableHystrix
public class Cloud1ProdApp {public static void main(String[] args) {SpringApplication.run(Cloud1ProdApp.class);}
}编写带有短路方法的测试Controller
RestController
RequestMapping(hystrix)
public class Hi_HystrixController {Autowiredprivate OrderService orderService;HystrixCommand(fallbackMethod getOrderHystrix)RequestMapping(/order)public Order getOrder(String id) {if(StringUtils.isBlank(id)){throw new RuntimeException(参数ID不可以为空);}return orderService.getOrder(id);}/*** 注意这个熔断的方法里的参数列表要和上面的方法参数列表相同* 否则报错com.netflix.hystrix.contrib.javanica.exception.FallbackDefinitionException: fallback method wasnt found*/public Order getOrderHystrix(String id) {id UUID.randomUUID().toString();return orderService.getOrder(id).setId(请传入正确的ID);}
}服务降级代码案例基于之前搭建的cloud1_consumer项目修改
引入依赖
dependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-starter-openfeign/artifactId
/dependency
dependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-starter-netflix-hystrix/artifactId
/dependency编写yml配置
feign:hystrix:enable: true编写Feign接口
Service
FeignClient(value CLOUD1-PROVIDER,fallbackFactory OrderServiceFallBackFactory.class)
public interface RestOrderService {GetMapping(/)String index();PostMapping(/getOrder)Order restGetOrder();// 我们这次测试的接口 PostMapping(/hystrix/order)Order restGetOrderFall();
}编写降级回调工厂类 OrderServiceFallBackFactory
Component
public class OrderServiceFallBackFactory implements FallbackFactoryRestOrderService {Overridepublic RestOrderService create(Throwable cause) {return new RestOrderService() {Overridepublic String index() {return 降级;}Overridepublic Order restGetOrder() {return null;}Overridepublic Order restGetOrderFall() {return new Order().setId(没有找到可能是未传入ID).setCreateTime(SimpleDateFormat.getDateTimeInstance().format(new Date()));}};}
}编写测试Controller
RestController
RequestMapping(/fgfall)
public class RestOrderFeignController2 {Autowiredprivate RestOrderService restOrderService;RequestMapping(/order2)public Order getOrder() {return restOrderService.restGetOrderFall();}
}注意这里高版本的springcloud2021版本不清楚为什么无法实现
Hystrix流监控Dashboard 代码案例
生产侧被监测方依赖配置与代码
dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-actuator/artifactId
/dependency#暴露全部的监控信息
management:endpoints:web:exposure:include: *Bean
public ServletRegistrationBean hystrixMetricsStreamServlet(){ServletRegistrationBean registrationBean new ServletRegistrationBean(new HystrixMetricsStreamServlet());registrationBean.setLoadOnStartup(1);registrationBean.addUrlMappings(/actuator/hystrix.stream);registrationBean.setName(HystrixMetricsStreamServlet);return registrationBean;
}监控客户端依赖配置与代码cloud1_hystrix_dashboard
?xml version1.0 encodingUTF-8?project xmlnshttp://maven.apache.org/POM/4.0.0 xmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsdparentartifactIdcloud1_parent/artifactIdgroupIdcom.hx/groupIdversion1.0-SNAPSHOT/version/parentmodelVersion4.0.0/modelVersionartifactIdcloud1_hystrix_dashboard/artifactIdnamecloud1_hystrix_dashboard/namepropertiesproject.build.sourceEncodingUTF-8/project.build.sourceEncodingmaven.compiler.source1.7/maven.compiler.sourcemaven.compiler.target1.7/maven.compiler.target/propertiesdependenciesdependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId/dependencydependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-starter-netflix-hystrix/artifactId/dependencydependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-starter-netflix-hystrix-dashboard/artifactId/dependency/dependencies
/projectpackage com.hx;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.hystrix.EnableHystrix;
import org.springframework.cloud.netflix.hystrix.dashboard.EnableHystrixDashboard;SpringBootApplication
// 启用hystrix监控
EnableHystrixDashboard
EnableHystrix
public class DashboardApp {public static void main(String[] args) {SpringApplication.run(DashboardApp.class,args);}
}