(五)SpringCloud-Ribbon负载均衡

九、Ribbon负载均衡 使用Ribbon做负载均衡,并配置轮询策略,默认为轮询 阅读详情

1、Spring Cloud Ribbon简介

Spring Cloud Ribbon是基于Netflix Ribbon实现的一套客户端负载均衡的工具。它有助于控制Http和Tcp客户端的行为。通过SpringCloud的封装,可以让我们轻松的将面向服务的REST模板请求自动转换成客户端负载均衡的服务调用

官网参考地址:
官网:https://www.springcloud.cc/spring-cloud-greenwich.html#spring-cloud-ribbon

中文:http://docs.springcloud.cn/user-guide/ribbon/


2、Ribbon提供了七种负载均衡策略

名称解释
RoundRobinRule轮训策略
RandomRule随机策略
BestAvailableRule过滤出故障服务器后,选择一个并发量最小的
WeightedResponseTimeRule针对响应时间加权轮询
AvailabilityFilteringRule可用过滤策略,先过滤出故障的或并发请求大于阈值的一部分服务实例,然后再以线性轮询的方式从过滤后的实例清单中选出一个
ZoneAvoidanceRule从最佳区域实例集合中选择一个最优性能的服务实例
RetryRule选择一个Server,如果失败,重新选择一个Server重试

3、微服务架构下如何使用Ribbon

3.1 使用Eureka作为注册中心时使用Ribbon

3.1.1 引入ribbon依赖

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>

3.1.2 往容器中注入RestTemplate

使用@LoadBalanced注解赋予RestTemplate负载均衡的能力

@Bean
@LoadBalanced
public RestTemplate createRestTemplate(){
    return new RestTemplate();
}

3.1.3 配置RibbonClient

例如:注入负载均衡规则,默认是轮询,更多配置以及配置实现类参见本文档的 Ribbon的相关配置

@Configuration
public class MyRibbonRuleConfig {
	// 为指定轮询规则为随机
    @Bean
    public IRule myRule(){
        return new RandomRule();
    }
}

注:这个配置类MyRibbonRuleConfig 必须使用@Configuration注解标识,并且每一个配置都要用@Bean注解

如果我们将这个配置类放在@ComponentScan注解的扫描包下,则会对所有的@RibbonClients客户端生效,但是有时候,我们想要针对不同的客户端,使用不同的配置(例如不同的负载均衡规则),就需要排除该配置类,可以通过@ComponentScan或@SpringBootApplication限定扫包范围(@ComponentScan配置排除:@ComponentScan(excludeFilters = { @ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE, classes = MyRibbonRuleConfig.class)}))或者将这个类不与启动类放在同一个包下。

3.1.4 为服务指定ribbon配置

// 启动类为某个服务指定负载均衡规则
@SpringBootApplication
@EnableEurekaClient
// 修改针对PROVIDER-PAYMENT-8001-3服务的轮训规则,多个不同的服务使用不同的规则,则在@RibbonClients中配置多个@RibbonClient
@RibbonClients(value = {@RibbonClient(name="PROVIDER-PAYMENT-8001-3",configuration = MyRibbonRuleConfig.class)})
public class EurekaOrder80Start {
    public static void main(String[] args) {
        SpringApplication.run(EurekaOrder80Start.class,args);
    }
}

3.1.5 使用RestTemplate调用服务

 // 通过在eureka上注册过的微服务名称调用
public static final String PAYMENT_SRV = "http://PROVIDER-PAYMENT-8001-3/study";

@Resource
private RestTemplate restTemplate;

// 127.0.0.1/study/consumer/payment/create?serial=xiaohong
@GetMapping("/consumer/payment/create")
public CommonResult create(Payment payment)
{
    return restTemplate.postForObject(PAYMENT_SRV + "/provider/payment/insertPayment",payment,CommonResult.class);
}

3.1.6 Demo示例

gitee地址中的cloud-eureka-consumer-order80和cloud-eureka-provider-payment8001-3模块


3.2 在没有Eureka的情况下使用Ribbon

官网教程:
在这里插入图片描述


3.2.1 调用方式一:使用Ribbon的Api

这地方需要注意的是loadBalancer.choose()方法返回的已经是服务的真实地址了。调用的时候需要使用不带负载均衡的RestTemplate去调用。

@Autowired
private LoadBalancerClient loadBalancer;

// 没有负载均衡的restTemplate,如果这里也使用负载均衡的restTemplate,那么在调用getForObject的时候,则会将uri中的域名地址作为服务名称,再去查询对应的IP地址。
// 这当然就会找不到啦,因为loadBalancer.choose()返回的已经是服务真实的ip地址了
@Resource(name = "restTemplate")
private RestTemplate restTemplate;

// 127.0.0.1/study/consumer/payment/get2/1
@GetMapping("/consumer/payment/get2/{id}")
public CommonResult getPayment2(@PathVariable Long id) {
    ServiceInstance instance = loadBalancer.choose("PROVIDER-PAYMENT-8001-3");
    URI uri = UriComponentsBuilder.fromUriString(String.format("http://%s:%s/study/provider/payment/get/{id}", instance.getHost(), instance.getPort()))
            .build()
            .expand(id) // 替换url中的模板参数
            .encode(StandardCharsets.UTF_8) // 设置编码
            .toUri();
   return restTemplate.getForObject(uri,CommonResult.class);
}

3.2.2 调用方式二:使用带负载均衡的RestTemplate

// 通过在eureka上注册过的微服务名称调用
public static final String PAYMENT_SRV = "http://PROVIDER-PAYMENT-8001-3/study";

// 带有负载均衡的RestTemplate
@Resource(name = "restTemplateLoadBalanced")
private RestTemplate restTemplateLoadBalanced;

// 127.0.0.1/study/consumer/payment/get/1
@GetMapping("/consumer/payment/get/{id}")
public CommonResult getPayment(@PathVariable Long id)
{
    return restTemplateLoadBalanced.getForObject(PAYMENT_SRV + "/provider/payment/get/"+id, CommonResult.class, id);
}

3.2.3 通过listOfServers配置的服务器列表

禁用 Eureka 后(ribbon.eureka.enabled=false,也可以不引入Eureka的包)手动配置PROVIDER-PAYMENT-8001-3服务的地址

# 通过配置的方式为PROVIDER-PAYMENT-8001-3服务配置负载均衡的规则
PROVIDER-PAYMENT-8001-3:
  ribbon:
    listOfServers: localhost:8001,localhost:8002

3.2.4 完整demo

gitee地址中的cloud-ribbon-consumer-order80模块


4、如何使用RestTemplate

4.1 GET请求

4.1.1 getForObject

getForObject有以下3种重载方法

  • public <T> T getForObject(String url, Class<T> responseType, Object... uriVariables)
    该方法提供了三个参数,其中url为请求的地址,responseType为请求响应体body的包装类型,urlVariables为url中的参数绑定

  • public <T> T getForObject(String url, Class<T> responseType, Map<String, ?> uriVariables)
    该方法与上面的相似,只是用map来封装参数。

  • public <T> T getForObject(URI url, Class<T> responseType)
    使用统一资源标识符来封装请求地址和参数

/**
 * 对于getForObject的三种重载方法调用demo
 * 127.0.0.1/study/restTemplateTestOrder/payment/getObject_1/1
 * @param id
 * @return
 */
@GetMapping("/restTemplateTestOrder/payment/getObject_1/{id}")
public CommonResult getPayment(@PathVariable Long id)
{
	CommonResult commonResult = new CommonResult();
	Map<String,CommonResult> resultMap = new HashMap<>();
	// getForObject(String url, Class<T> responseType, Object... uriVariables)
	CommonResult result1 = restTemplate.getForObject(PAYMENT_SRV + "/restTemplateTestPayment/payment/get_1/" + id, CommonResult.class, id);
	CommonResult result2 = restTemplate.getForObject(PAYMENT_SRV + "/restTemplateTestPayment/payment/{1}/{2}", CommonResult.class, "get_1",id);

	CommonResult result3 = restTemplate.getForObject(PAYMENT_SRV + "/restTemplateTestPayment/payment/get_2?id=" + id, CommonResult.class, id);
	CommonResult result4 = restTemplate.getForObject(PAYMENT_SRV + "/restTemplateTestPayment/payment/get_2?id={1}&serial={2}", CommonResult.class, id,"小明");
	resultMap.put("result1",result1);
	resultMap.put("result2",result2);
	resultMap.put("result3",result3);
	resultMap.put("result4",result4);

	// getForObject(String url, Class<T> responseType, Map<String, ?> uriVariables)
	Map<String, Object> param = new HashMap<>();
	param.put("id",id);
	param.put("get_1","get_1");
	param.put("serial","小王");
	CommonResult result5 = restTemplate.getForObject(PAYMENT_SRV + "/restTemplateTestPayment/payment/{get_1}/{id}", CommonResult.class, param);
	CommonResult result6 = restTemplate.getForObject(PAYMENT_SRV + "/restTemplateTestPayment/payment/get_2?id={id}&serial={serial}", CommonResult.class, param);
	resultMap.put("result5",result5);
	resultMap.put("result6",result6);

	// getForObject(URI url, Class<T> responseType)
	MultiValueMap<String,String> mapParam = new LinkedMultiValueMap();
	mapParam.add("serial","小王1");
	mapParam.add("serial","小王2");
	URI uri = UriComponentsBuilder.fromUriString(PAYMENT_SRV + "/restTemplateTestPayment/payment/get_2?id={id}")
			.queryParams(mapParam) // 设置查询参数
			.build()
			.expand(id) // 替换url中的模板参数
			.encode(StandardCharsets.UTF_8) // 设置编码
			.toUri();
	CommonResult result7 = restTemplate.getForObject(uri, CommonResult.class);
	resultMap.put("result7",result7);

	commonResult.setData(resultMap);
	return commonResult;
}

4.1.2 getForEntity

  • public <T> ResponseEntity<T> getForEntity(String url, Class<T> responseType, Object... uriVariables)
  • public <T> ResponseEntity<T> getForEntity(String url, Class<T> responseType, Map<String, ?> uriVariables)
  • public <T> ResponseEntity<T> getForEntity(URI url, Class<T> responseType)

这3个方法和4.1.1中的3个方法对应。只是返回的是ResponseEntity。
可通过responseEntity获取响应头,响应状态,响应体等信息。
// 状态信息
HttpStatus statusCode = responseEntity.getStatusCode();
int statusCodeValue = responseEntity.getStatusCodeValue();

// 请求头信息
HttpHeaders headers = responseEntity.getHeaders();

// 响应体
T body = responseEntity.getBody();

4.2 POST请求(使用demo参考4.1的Get请求)

关于post请求中第二个参数Object request说明:
在这里插入图片描述
从源码可以看到,如果我们传入的是一个非HttpEntity,则封装为一个HttpEntity。我们在实际调用过程中,可以使用传递一个Object类型的参数,这个参数会被放在请求体body中,这就和前端发送post请求一样。我们就可以调用服务提供者方的post接口。

4.2.1 postForObject

  • public <T> T postForObject(String url, @Nullable Object request, Class<T> responseType,Object... uriVariables)
  • public <T> T postForObject(String url, @Nullable Object request, Class<T> responseType,Map<String, ?> uriVariables)
  • public <T> T postForObject(URI url, @Nullable Object request, Class<T> responseType)

4.2.2 postForObject

  • public <T> ResponseEntity<T> postForEntity(String url, @Nullable Object request,Class<T> responseType, Object... uriVariables)
  • public <T> ResponseEntity<T> postForEntity(String url, @Nullable Object request,Class<T> responseType, Map<String, ?> uriVariables)
  • public <T> ResponseEntity<T> postForEntity(URI url, @Nullable Object request, Class<T> responseType)

4.2.3 postForLocation

  • public URI postForLocation(String url, @Nullable Object request, Object... uriVariables)
  • public URI postForLocation(String url, @Nullable Object request, Map<String, ?> uriVariables)
  • public URI postForLocation(URI url, @Nullable Object request)
    该方法实现了以POST请求提交资源,并返回新的资源的URI。这样我们就可以将返回的URI作为参数去调用public <T> ResponseEntity<T> postForObject/postForEntity(URI url, @Nullable Object request, Class<T> responseType) 或 public <T> T getForObject/getForEntity/(URI url, Class<T> responseType) 方法。这实现了重定向的功能。

5、@LoadBalanced 注解作用原理简单讲解

为什么在 RestTemplate 上加了一个 @LoadBalanced 之后,RestTemplate 就能够跟 Eureka整合,让我们不但可以使用服务名称去调用接口,还能够自动通过注册中心的实例集群实现负载均衡,应该归功于 Spring Cloud 给大量的底层适配工作,将这些复杂都封装好了,用起来才会那么简单。

主要的逻辑就是@LoadBalanced修饰的 RestTemplate 会注册一个拦截器,在请求之前在拦截器中对请求的地址进行替换,或者根据具体的负载策略选择服务地址,然后再去调用真实的服务地址,这就是 @LoadBalanced 的原理

LoadBalancerAutoConfiguration类中:

public RestTemplateCustomizer restTemplateCustomizer(final LoadBalancerInterceptor loadBalancerInterceptor) {
	// 实现RestTemplateCustomizer中customize方法的对象,实现逻辑是为restTemplate添加LoadBalancerInterceptor拦截器
	return restTemplate -> {
		List<ClientHttpRequestInterceptor> list = new ArrayList<>(
				restTemplate.getInterceptors());
		list.add(loadBalancerInterceptor);
		restTemplate.setInterceptors(list);
	};
}

@Bean
public SmartInitializingSingleton loadBalancedRestTemplateInitializerDeprecated(
		final ObjectProvider<List<RestTemplateCustomizer>> restTemplateCustomizers) {
	return () -> restTemplateCustomizers.ifAvailable(customizers -> {
		for (RestTemplate restTemplate : LoadBalancerAutoConfiguration.this.restTemplates) {
			for (RestTemplateCustomizer customizer : customizers) {
				// 调用RestTemplateCustomizer中customize方法,为restTemplate添加LoadBalancerInterceptor拦截器
				customizer.customize(restTemplate);
			}
		}
	});
}

8.1、负载均衡

RibbonLoadBalancerClient类:

public <T> T execute(String serviceId, LoadBalancerRequest<T> request, Object hint)
		throws IOException {
	// 获取负载均衡器,里面包含serviceId下存活的实例
	ILoadBalancer loadBalancer = getLoadBalancer(serviceId);
	
	// 从负载均衡器中根据轮询规则获取一个实例的地址
	Server server = getServer(loadBalancer, hint);
	if (server == null) {
		throw new IllegalStateException("No instances available for " + serviceId);
	}
	RibbonServer ribbonServer = new RibbonServer(serviceId, server,
			isSecure(server, serviceId),
			serverIntrospector(serviceId).getMetadata(server));

	return execute(serviceId, ribbonServer, request);
}

在这里插入图片描述

8.2、地址替换

InterceptingClientHttpRequest类中的request.getURI()实际调用ServiceRequestWrapper类的getURI()方法,从instance中获取实例的IP地址。
在这里插入图片描述

ServiceRequestWrapper类
public URI getURI() {
	URI uri = this.loadBalancer.reconstructURI(this.instance, getRequest().getURI());
	return uri;
}

6、Ribbon的相关配置

锚点
Spring Cloud Netflix默认为Ribbon提供了以下的beans:

Bean类型Bean名称类名称功能
IClientConfigribbonClientConfigDefaultClientConfigImplribbon相关配置
IRuleribbonRuleZoneAvoidanceRule根据区域和可用性过滤服务器的规则
IPingribbonPingDummyPingIPing在Ribbon 框架中,负责检查服务实例是否存活(UP),DummyPing是IPing实现,永远返回true
ServerListribbonServerListConfigurationBasedServerList加载服务列表。ConfigurationBasedServerList则是从配置文件加载服务列表
ServerListFilterribbonServerListFilterZonePreferenceServerListFilter过滤服务列表,过滤掉所有和客户端环境里的配置的zone的不同的服务,如果和客户端相同的zone不存在,才不进行过滤
ILoadBalancerribbonLoadBalancerZoneAwareLoadBalancer负载均衡器
ServerListUpdaterribbonServerListUpdaterPollingServerListUpdater动态服务器列表更新器更新的策略

注:当Ribbon与Eureka一起使用时

  • 则DiscoveryEnabledNIWSServerList作为ribbonServerList的实现类
  • NIWSDiscoveryPing则是作为IPing接口的实现,该接口会委托给Eureka用于确定服务器是否启动

6.1 IRule

功能:根据特定算法从服务列表选取一个服务进行访问。

RoundRobinRule:轮询规则,默认规则
AvailabilityFilteringRule:负载均衡器规则,过滤掉1。由于多次访问故障而处于断路状态的服务,2。并发的连接数量超过阈值的服务。然后对剩余的服务列表按照RoundRobinRule策略进行访问。
WeightedResponseTimeRule:根据平均响应时间计算所有服务的权重,响应时间越快,服务权重越重,优先被选中
RetryRule:按照RoundRobinRule的策略获取服务。如果获取服务失败。在指定时间内进行重试,获取可用的服务
BestAvailableRule:此负载均衡器会过滤由于多次访问故障而处于断路状态的服务,然后选择一个并发量最小的服务
RandomRule:随意获取一个服务

6.2 IPing

功能:在后台运行的一个组件,用于检测服务器列表是否运行正常

NIWSDiscoveryPing:不执行真正的ping,如果DiscoveryClient认为是在线,则程序认为本次心跳成功,服务正常运行
PingUrl:此组件会使用HttpClient调用一个服务,如果调用成功,则认为本次心跳成功,表示服务正常运行
NoOpPing:永远返回true,表示服务永远正常
DummyPing:默认实现,默认返回true,表示服务永远正常

6.3 ServerList

功能:存储服务列表。分为静态和动态,如果为动态,后台有一个县城会定时刷新和过滤服务列表

ConfigurationBasedServerList:从配置文件中获取所有服务列表。(静态)
DiscoveryEnabledNIWSServerList:从EurekaClient中获取服务列表。(动态)
DomainExtractingServerList:代理类,根据ServerList的值实现具体的逻辑

6.4 ServerListFilter

该接口允许过滤配置或动态获取的具有所需特性的服务器列表

ZoneAffinityServerListFilter:过滤掉所有的不和客户端在相同zone的服务,如果和客户端相同的zone不存在,才不过滤不同zone服务
ZonePreferenceServerListFilter:ZoneAffinityServerListFilter的子类。和ZoneAffinityServerListFilter相似,但是比较的zone是发布环境里面的zone。过滤掉所有和客户端环境里的配置的zone的不同的服务,如果和客户端相同的zone不存在,才不进行过滤。
ServerListSubsetFilter:ZoneAffinityServerListFilter的子类。此过滤器确保客户端仅看到由ServerList实现返回的整个服务器的固定子集。它还可以定期用新服务器替代可用性差的子集中的服务器。

6.5 ServerListUpdater

功能:被DynamicServerListLoadBalancer用于动态的更新服务列表

PollingServerListUpdater:默认的实现策略,此对象会启动一个定时线程池,定时执行更新策略
EurekaNotificationServerListUpdater:当收到缓存刷新的通知梦回更新服务列表。

6.6 IClientConfig

功能:定义配置信息,用来初始化ribbon客户端和负载均衡器

DefaultClientConfigImpl:IClientConfig的默认实现,配置文件里的部分值为ribbon。

6.7 ILoadBalancer

功能:定义软件负载平衡器操作的接口。动态更新一组服务列表及根据指定算法从现有服务器列表中选择一个服务

DynamicServerListLoadBalancer:DynamicServerListLoadBalancer组合Rule、IPing、ServerList、ServerListFilter、ServerListUpdater实现类,实现动态更新和过滤更新服务列表
ZoneAwareLoadBalancer:这是DynamicServerListLoadBalancer的子类,主要加入zone的因素。统计每个zone的平均请求的情况,保证从所有zone选取对当前客户端服务最好的服务组列表

7、如何通过设置Properties配置文件自定义Ribbon客户端

支持的属性:

配置项对应的配置接口
.ribbon.NFLoadBalancerClassNameILoadBalancer
.ribbon.NFLoadBalancerRuleClassNameIRule
.ribbon.NFLoadBalancerPingClassNameIPing
.ribbon.NIWSServerListClassNameServerList
.ribbon.NIWSServerListFilterClassNameServerListFilter

例如为PROVIDER-PAYMENT-8001-3服务配置负载均衡规则:

PROVIDER-PAYMENT-8001-3:
  ribbon:
    NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RoundRobinRule

这里有个问题:
在这里插入图片描述
官网描述的优先级是:配置文件是高于@RibbonClient(configuration=MyRibbonConfig.class)定义的beans和默认值,但是经过我试验,优先级是@RibbonClient(configuration=MyRibbonConfig.class)>配置文件>默认值。

ps: 这个地方可能是这样,如果你在@RibbonClient注解的属性或者是配置文件配置了和默认值一样的配置,那么就等同于你没有配置。未在ribbon验证,因为我再使用feign的时候也遇到类似的问题。

情况如下:
decode404默认值是false。
当在@FeignClient注解配置decode404=false,配置文件decode404=true时,decode404的功能是开启的。
当在@FeignClient注解配置decode404=true,配置文件decode404=false时,decode404的功能也是开启的。


8、Ribbon的其他配置

8.1 超时时间

Ribbon 中有两种和时间相关的设置,分别是请求连接的超时时间和请求处理的超时时间,设置规则如下:


ribbon:	
  ConnectTimeout: 2000 # 请求连接的超时时间
  ReadTimeout: 5000 # 请求处理的超时时间

# 也可以为每个Ribbon客户端设置不同的超时时间, 通过服务名称进行指定:
PROVIDER-PAYMENT-8001-3: 
  ribbon:
    ReadTimeout: 5000
    ConnectTimeout: 2000

8.2 并发参数

ribbon:
	MaxTotalConnections: 500 # 最大连接数
	MaxConnectionsPerHost: 500 # 每个host最大连接数
	
PROVIDER-PAYMENT-8001-3: 
  ribbon:
    MaxTotalConnections: 500
    MaxConnectionsPerHost: 500

9、使用RetryRule配置重试

最简单的方法就是利用 Ribbon 自带的重试策略进行负载均衡和重试,此时只需要指定某个服务的负载策略为重试策略即可:

PROVIDER-PAYMENT-8001-3:
  ribbon:
    NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RetryRule

或者是针对所有客户端生效:
ribbon:
  NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RetryRule

当然也可是改用配置类的方式

Spring Cloud - Ribbon 负载均衡原理、负载策略、懒加载 ps:案例是上一章所讲的 “根据订单id查询订单的同时,把订单所属的用户信息一起返回”。上一章我们讲到 order-service(订单服务) 使用 RestTemplate 发送 Http 请求到 user-service(用户服务),同时我们使用 @LoadBalanced 注解增加负载均衡,通过负载均衡算法分配到 user-service 集群,那么中间这个负载均衡到底是什么东西在起作用?负载均衡算法到底是什么?接下来我们就一起来了解一下吧~ 阅读详情

相关推荐

【springcloud 微服务】Spring Cloud Ribbon 负载均衡使用策略详解

springcloud中ribbon负载均衡策略总结

congge_study的博客 7685

SpringCloud中Ribbon负载均衡配置

在启动类配置,使用此配置方法,对应全部服务都会进行该规则的负载均衡。在对应yml文件配置,使用这种方法可以对某一个服务单独配置。

znq123127的博客 448

STM32F407硬件IIC驱动OLED避坑实录:从‘不显示’到‘稳定刷屏’的完整调试过程

本文详细记录了使用STM32F407硬件IIC驱动OLED屏幕的完整调试过程,从初始的‘不显示’问题到最终实现‘稳定刷屏’。文章涵盖了硬件接线、I2C外设配置、常见问题排查及性能优化技巧,特别针对STM32标准库开发中的难点提供了实用解决方案,是嵌入式开发者驱动OLED屏幕的实用指南。

weixin_30315723的博客 303

SpringCloud 第三讲 Ribbon负载均衡策略(相关配置)

代码方式:配置灵活,但修改时需要重新打包@Bean配置方式:直观,方便,无需重新打包发布,但是无法做全局配置userserver: #你的服务名称ribbon:NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule #负载均衡规则为何要开启饥饿加载,因为在我们第一次加载时候,响应时间比较慢,原因是第一次加服务需要从服务注册列表中拉取服务实例,以及初始化相关的组件到Spring中。

ggjklncffd的博客 694

开发者体验度量:构建DevEx评估体系的方法论与工具

在深入讨论度量方法前,我们需要明确什么是开发者体验(DevEx)。许多人将其简化为"开发工具好不好用",这是一个危险的误解。开发者体验是指开发者在完成工作过程中的整体感受和效率,它由三大核心维度组成:工具与基础设施:开发、测试、部署工具链的效能流程与协作:工作流程的顺畅度和团队协作的效率文化与成长:支持实验、学习和专业发展的环境这三个维度相互作用,共同决定了开发者能否高效且愉悦地完成工作。开发者体验不是一个目的地,而是一段持续的旅程。

2401_88760782的博客 1429

ZYNQ实战:PS端驱动DMA实现高效数据流转与验证

本文详细介绍了在ZYNQ平台上通过PS端驱动DMA实现高效数据流转的实战方法。从ZYNQ的PS与PL数据交互基础出发,深入解析DMA核心价值,包括硬件平台搭建、Vivado配置、PS端软件架构设计及性能优化技巧,帮助开发者提升数据传输效率与系统性能。

weixin_29192141的博客 436

SpringCloud - Spring Cloud Netflix 之 Ribbon负载均衡(五)

Spring Cloud Ribbon 是一套基于 Netflix Ribbon 实现的客户端负载均衡和服务调用工具Ribbon 是 Netflix 公司发布的开源组件,其主要功能是提供客户端的负载均衡算法和服务调用。Spring Cloud 将其与 Netflix 中的其他开源服务组件(例如 Eureka、Feign 以及 Hystrix 等)一起整合进 Spring Cloud Netflix 模块中,整合后全称为 Spring Cloud Netflix RibbonRibbon 是 Spring C

MinggeQingchun的博客 871

关于WPF PasswordBox 增加提示文案,请输入密码,亲测最快方案,改最少的代码!!!

关于WPF PasswordBox 增加提示文案,请输入密码,亲测最快方案,不需要像其他方案改任何PasswordBox的样式,直接加个texbox控件显示隐藏即可1.xaml,注意关键代码,样式之类可以不管 2.xaml.cs

鸣的博客 1543

【Spring Cloud】分布式必学springcloud(五)——Ribbon自定义负载均衡策略

这里我借鉴上一篇博客的框架,对ribbon模块进行修改假定这次修改为随机访问RandomRule。##3.1修改配置文件eurekaclienthttpserverport7000springnameclient1ribbon在配置文件中,我们指明了client1服务要使用策略。client1ribbon。...

哈士奇 4652

西门子与汇川伺服脉冲连接(速度模式)

如何使用西门子PLC与汇川伺服进行脉冲连接

2301_77347966的博客 1万+

LDRA Testbed软件静态分析_操作指南

从本文起,将开始LDRA Testbed(TBrun)教程的系列文章,包括软件静态分析、单元测试、集成测试,以及基于Testbed的自动化工具开发、持续集成、常见问题解答等。LDRA公司是专业的软件测试工具与测试技术、咨询服务提供者,其总部位于英国利物浦。其旗舰产品Testbed/TBrun功能全面、易于使用,不仅适合于主机平台软件测试,同时适合于嵌入式软件测试。不仅能进行软件静态测试,还能进行软件单元测试、软件集成测试,在白盒测试领域运用比较广泛。

文章主要涉及嵌入式软件开发、测试、项目管理等,欢迎交流,共同进步。 1万+

SpringCloud(五)负载均衡之Ribbon

SpringCloud(五)负载均衡之Ribbon 关于负载均衡 负载均衡一般分为服务器端负载均衡和客户端负载均衡 所谓服务器端负载均衡,比如Nginx、F5这些,请求到达服务器之后由这些负载均衡器根据一定的算法将请求路由到目标服务器处理。 所谓客户端负载均衡,比如我们要说的Ribbon,服务消费者客户端会有一个服务器地址列表,调用方在请求前通过一定的负载均衡算法选择一个服务器进行访问,负载均衡算法的执行是在请求客户端进行。 Ribbon是Netflix发布的负载均衡器。Eureka一般配合Ribbon进行

weixin_49741990的博客 283

【系统架构设计师-2024下半年真题】案例分析-参考答案及部分详解(完整回忆版)

根据h中描述,为了保证高可靠性,有ping/echo,心跳机制两种策略,从资源利用率问为啥心跳更好。王工觉得使用ping/echo好,但李工觉得从系统资源利用率来说,使用心跳机制好 1、针对质量属性可以使用ping/echo和心跳模式实现,分别简述ping/echo和心跳的实现原理。 2、张工认为心跳策略比较适合,简述为什么?

数据知道的博客 1万+

springcloud(五)Ribbon 负载均衡

一、概述 前面一节已经通过 RestTemplate 实现了服务消费者对服务提供者的调用,这只是实现了最基本的需求,如果在某个具体的业务场景下,对于某服务的调用需求激增,这时候我们就需要为该服务实现负载均衡以满足高并发访问,在一个大型的分布式应用系统中,负载均衡(Load Balancing)是必备的。 二、Spring Cloud Ribbon Spring Cloud 提供了实现负载均衡...

ByteSea数海拾光 443

太阳敏感器:卫星姿态控制的“指南针

在卫星姿态控制系统中,太阳敏感器(Sun Sensor) 是至关重要的光学姿态敏感器之一。它通过探测太阳光的方向,为卫星提供关键的姿态参考信息,确保卫星能够正确调整自身方位,维持稳定的对日定向,保障能源供应和任务执行。

ScilogyHunter的博客 1731

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

SpringCloud学习笔记(五)Ribbon负载均衡

概述 Spring Cloud Ribbon是基于Netflix Ribbon实现的一套客户端负载均衡的工具。 简单的说,Ribbon是Netflix发布的开源项目,主要功能是提供客户端的软件负载均衡算法,将Netflix的中间层服务连接在一起。Ribbon客户端组件提供一系列完善的配置项如连接超时,重试等。简单的说,就是在配置文件中列出Load Balancer(简称LB)后面所有的机器,Ri...

huangpf_vcx 277

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

SpringCloud全家桶(五)——Ribbon负载均衡

文章目录五、Ribbon客户端负载均衡1、基本概念2、调用关系3、用户服务集群配置4、消费者Order-server集成Ribbon5、测试结果 五、Ribbon客户端负载均衡 1、基本概念 为什么要使用Ribbon:为防止应用出现单节点故障,为服务集群得时候,会出现一个服务在注册中心有两个通讯地址,当我们在调用这个服务得时候应该如何选择,这时候我们就要用到 Ribbon,也就是负载均衡器,他的功能就是帮助我们做请求得转发。Ribbon可以按照负载均衡算法(如简单轮询,随机连接等)向多个服务发起调用(正好可

WLK0423的博客 398

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

SpringCloud入门实战(五)-Ribbon负载均衡集成

SpringCloud从0到1系列-集成ribbon

一个喜欢诗和远方的程序媛 1853

springcloud 简单示例之负载均衡feign、ribbon(五)

1.Spring cloud 服务间调用一般有两种方式,第一种:ribbon+restTemplate、第二种:fegin(Feign默认集成了ribbon),两种方式都支持负载均衡。 2.两种方式中,被调用的服务代码和配置不需要做任何修改,改改启动端口,启动两个服务就可以了。 server: port: 7001 spring: application: name: spri...

玩火的稻草人的博客 335

SpringCloud Ribbon实战之自定义负载均衡策略(五)

下面我们继续讲Ribbon自定义的负载均衡策略 在启动微服务的时候就能去加载我们自定义的Ribbon配置类,从而使配置生效, 例如使用新的注解@RibbonClient:@RibbonClient(name="MICROSERVICECLOUD-DEPT",configuration=MySelfRule.class) 下面我们就开始吧 1,修改消费者客户端的主启动类,在主启动类上加上新的...

ywl470812087的博客 11万+

spring cloud Alibaba 实现负载均衡 Ribbon学习笔记五

Ribbon实现负载均衡一、实现方式二、手写客户端侧负载均衡器三、使用Ribbon实现负载均衡四、Ribbon 组成五、Ribbon 配置 一、实现方式 服务器端负载均衡(单体架构) 客户端侧负载均衡(内容中心相对用户中心,属于客户端,可在内容中心集群中配置负载均衡规则) 二、手写客户端侧负载均衡器 随机负载均衡算法 三、使用Ribbon实现负载均衡 1、定义:Netfix开源的客户端侧负载均衡器,即提供了负载均衡算法 2、架构演进: 3、整合Ribbon 加依赖:不需要,spri

lzf2284466的博客 977

SpringCloud(五):Ribbon负载均衡服务调用

目录 概述 是什么 官网资料 能干嘛 LB(负载均衡) Ribbon本地负载均衡客户端和Nginx服务客服端负载均衡的区别 Ribbon负载均衡演示 Ribbon核心组件IRule Ribbon负载均衡算法 概述 是什么 Spring Cloud Ribbon是基于Netflix Ribbon实现的一套客户端,负载均衡的工具。 简单来说,ribbon是Netflix发布的开源项目,主要功能是提供客户端软件负载均衡的算法和服务调用。 Ribbon客户端组件提供一系列完善的配置如

Clawww的学习笔记 265

SpringCloud 入门教程(五): Ribbon实现客户端的负载均衡

接上节,假如我们的Hello world服务的访问量剧增,用一个服务已经无法承载, 我们可以把Hello World服务做成一个集群。 很简单,我们只需要复制Hello world服务,同时将原来的端口8762修改为8763。然后启动这两个Spring Boot应用, 就可以得到两个Hello World服务。这两个Hello world都注册到了eureka服务中心。这时候再访问http:/...

ywl470812087的博客 10万+

搭建springcloud的demo之Ribbon负载均衡(五)

Ribbon的负载均衡算法 简单轮询算法:一台服务器一次 Ribbon在工作时分成两步 第一步先选择EurekaServer,它优先选择在同一个区域内负载较少的server; 第二步再根据用户指定的策略,在从server取到的服务注册列表中选择一个地址; ...

yuanting_的博客 424

SpringCloud系列之五: Ribbon客户端负载均衡

1.Ribbon 是什么? 一套客户端负载均衡工具. 举例:窗口点餐,点餐时会分好几个窗口,就是为了让人员分摊到不同的窗口,来避免人员堆积,我们点餐的时候,作为客户消费者会主动地选择人员最少的窗口的去点餐. 2.能做什么? 负载均衡的工具,将用户的请求分摊到多个服务器上,从而达到高可用.,负载均衡算法可以自定义. LB集成到消费方,消费方通过Ribbon,从服务注册中西获知哪些服务可用,然后根据算...

努力发光呀 324

SpringCloud(五)——Ribbon负载均衡服务调用

文章目录一、Ribbon概述1.是什么?2.官网资料3.能干嘛二、Ribbon负载均衡演示1.架构说明2.POM文件3.RestTemplate的使用三、Ribbon核心组件IRule1.IRule:根据特定算法从服务列表中选取一个要访问的服务2.如何替换算法?三、Ribbon负载均衡算法 一、Ribbon概述 1.是什么? 2.官网资料 https://github.com/Netflix/ribbon/wiki/Getting-Started Ribbon目前也进入维护模式 未来替换方案 3.

筱筱攻程师的博客 381
上一篇: mybatis遇见的问题(持续更新)
下一篇: 查看Linux日志
村口老师傅
博客等级 码龄9年 67粉丝 107原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值