微服务负载均衡器Ribbon介绍、使用以及原理和源码理解_nfloadbalancerruleclassname-程序员宅基地

技术标签: 【面试精选】  微服务  面试  负载均衡  spring cloud  【架构】  ribbon  【微服务】  

微服务负载均衡器Ribbon介绍、使用以及原理和源码理解

1. Ribbon简介

Ribbon是Netflix开源的客户端负载均衡器,它可以很好的控制HTTP和TCP客户端的行为。Ribbon支持配置客户端添加重试和超时等功能,旨在使客户端更加强健。Ribbon在分布式系统中提供一系列完整的服务,如:

  • 负载均衡
  • 故障检测
  • 暂时性错误重试
  • 客户端配置化等

目前Ribbon支持负载均衡的策略有:

  • 轮询(RoundRobinRule):轮流选择服务器
  • 随机(RandomRule):随机选择服务器
  • 重试(RetryRule):在一个配置时间内当选择服务器不成功,则一直尝试该服务器,超过配置时间才尝试其他服务器
  • 最可用(AvailabilityFilteringRule):过滤掉那些因为一直连接失败的不可用的服务器,并选择一个可用的服务器
  • 响应时间(WeightedResponseTimeRule):根据平均响应时间计算所有服务器的权重,响应时间越快的服务器权重越大被选择的概率越高

2. Ribbon实现负载均衡原理

Ribbon实现负载均衡的核心思想是客户端通过轮询(RoundRobin)等负载均衡策略从服务注册中心获取服务实例列表,然后缓存到本地,客户端根据负载均衡策略选择一个服务实例发送请求。

Ribbon的处理流程:

  1. 客户端向服务注册中心(如Eureka)订阅获取服务实例清单信息
  2. 客户端会把获取到的服务实例清单信息缓存到本地
  3. 客户端根据负载均衡算法(轮询RoundRobin)选择一个服务实例
  4. 客户端将请求发送到选择的服务实例地址
  5. 如果在指定时间内服务实例没有响应则会进行重试或熔断,然后在服务实例清单中剔除该实例

Ribbon通过以上流程实现了负载均衡和容错。

3. Ribbon使用示例

引入依赖

在Spring Cloud项目中引入:

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

开启Ribbon

在应用主类上添加@RibbonClient注解开启Ribbon,并指定服务名。例如:

@SpringBootApplication
@RibbonClient(name = "service-name")  
public class RibbonApplication {
    
    public static void main(String[] args) {
    
        SpringApplication.run(RibbonApplication.class, args);
    }
}

使用RestTemplate访问服务

通过RestTemplateloadBalanced方法开启Ribbon的负载均衡功能。例如:

@Autowired
private RestTemplate restTemplate;

@Bean
public RestTemplate getRestTemplate() {
    
   RestTemplate restTemplate = new RestTemplate();
   restTemplate.setLoadBalancer(myLoadBalancer());  // 开启负载均衡
   return restTemplate; 
}

public String doOtherStuff() {
    
    String result = restTemplate.getForObject("http://service-name/doStuff", String.class);
}

doOtherStuff()方法请求http://service-name/doStuff时,Ribbon会根据配置的负载均衡策略,选择一个service-name服务实例发送请求。

4. Ribbon负载均衡算法

Ribbon目前支持以下几种负载均衡算法:

  • RoundRobinRule:轮询,默认算法,轮流选择服务器
  • RandomRule:随机,随机选择一个服务器
  • AvailabilityFilteringRule:过滤掉故障服务器后选择其余服务器
  • WeightedResponseTimeRule:根据响应时间分配权重,响应时间短的服务器分配权重大,被选择的概率高
  • RetryRule:在指定时间内若请求失败,则一直尝试该服务器,超过指定时间才尝试其他服务器
  • BestAvailableRule:选择一个最小的并发请求的服务器
  • ZoneAvoidanceRule:复合判断服务器所在区域性能和并发请求选择服务器

配置负载均衡算法

要配置Ribbon的负载均衡算法,需要在@RibbonClient指定的服务名称下添加配置。例如:

service-name: 
  ribbon:
    NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule

上面例子将为service-name服务设置RandomRule随机负载均衡算法。

如果要实现自定义的负载均衡算法,可以实现IRule接口,然后将实现类全类名配置为NFLoadBalancerRuleClassName的值。

配置服务实例的可访问性检查

Ribbon中使用IClientConfig接口来定义服务实例的一些配置,我们可以实现该接口的getClientConfigKey方法指定服务实例的可访问性检查,例如:

public class MyClientConfig implements IClientConfig {
    
    @Override
    public String getClientConfigKey() {
    
        return "MyClientConfig";
    }
} 

然后在yml中配置:

service-name:
  ribbon: 
    NFLoadBalancerRuleClassName: com.netflix.loadbalancer.MyClientConfig

这将为service-name服务启用MyClientConfig的配置,进而实现自定义的服务实例可访问性检查逻辑。

6. Ribbon高级特性

连接池和超时

Ribbon提供了对连接池和超时时间的配置,我们可以在yml文件中配置:

service-name:
  ribbon:
    MaxAutoRetries: 1         # 最大自动重试次数
    MaxAutoRetriesNextServer: 1 # 切换服务器最大重试次数
    OkToRetryOnAllOperations: true # 是否所有操作都重试
    ConnectTimeout: 3000     # 连接超时时间(ms)
    ReadTimeout: 3000        # 读取超时时间(ms)
    ConnPoolTTL: 60000       # 连接池中连接存活时间(ms)    

以上配置可以很好的提高Ribbon的容错性和服务可靠性。

重试机制

如前面所述,Ribbon的RetryRuleMaxAutoRetries配置实现了重试机制。当我们请求的服务实例在指定时间内没有响应时,Ribbon会自动重试其他服务实例,这可以避免因为某个实例故障导致服务不可用的情况。

熔断机制

Ribbon默认也实现了基本的熔断机制。当一个服务实例长时间不可达时,Ribbon会将其从服务实例清单中剔除一段时间,这个时间由NIWSServerListPollerserverListRefreshInterval属性配置,默认是30秒。

此外,Ribbon还可以与Netflix Hystrix结合使用,实现更为强大的熔断和容错功能。在熔断打开期间,Ribbon将不会向熔断的实例发送请求。

获取服务实例清单的时间控制

Ribbon通过NIWSServerListPoller控制去服务注册中心获取服务实例清单的时间间隔,该时间间隔由serverListRefreshInterval属性配置,默认为30秒。

请求重试

在请求失败时,Ribbon可以自动发起重试请求。重试次数由MaxAutoRetriesMaxAutoRetriesNextServer控制,这两个属性默认都是1次。当MaxAutoRetries重试次数用完,Ribbon会切换到另一个服务实例发起MaxAutoRetriesNextServer重试次数的请求。

手动刷新服务实例清单

除了定时去获取服务实例清单外,我们也可以手动刷新。例如:

@Autowired
private ServerListUpdater serverListUpdater;

public void refreshServers() {
    
    serverListUpdater.refresh(true);
}

调用refresh(true)方法可以立即强制刷新服务实例清单。

以上就是Ribbon的一些高级特性,可以让我们更好的利用Ribbon实现服务调用的高可用。

7. Ribbon源码分析(关键类)

了解Ribbon的原理和使用后,我们来分析一下其源码,以便获得更深入的理解。

ServerList

ServerList接口定义获取服务实例清单的接口,其实现类ConfigurationBasedServerList从服务注册中心获取服务实例清单。ServerList的具体实现类由ServerListImpl<T>类的NIWSServerListClassName属性配置。

ILoadBalancer

ILoadBalancer接口定义负载均衡算法接口,其实现类RoundRobinRuleRandomRule等实现相应的负载均衡算法。ILoadBalancer的具体实现由BaseLoadBalancerrule属性配置。

IPing

IPing接口定义服务实例健康检查接口,其实现类DummyPing返回所有服务实例都是健康的。IPing的具体实现由BaseLoadBalancerping属性配置。

ServerListUpdater

ServerListUpdater定时从ServerList的实现类ConfigurationBasedServerList获取最新的服务实例清单,并通知LoadBalancerClient刷新本地缓存的服务实例清单。获取服务实例清单的时间间隔由pollingInterval属性配置。

LoadBalancerClient

LoadBalancerClient维护一个服务实例清单的本地缓存,其使用ServerListUpdater定时获取最新的服务实例清单更新本地缓存。LoadBalancerClient也维护一个用于选择服务实例的BaseLoadBalancer

LoadBalancerClient维护一个服务实例清单的本地缓存,其使用ServerListUpdater定时获取最新的服务实例清单更新本地缓存。LoadBalancerClient也维护一个用于选择服务实例的BaseLoadBalancer

过上面的源码类介绍可以清楚的了解Ribbon的内部工作机制:

  1. ServerListUpdater定时从ConfigurationBasedServerList获取服务实例清单
  2. LoadBalancerClient维护服务实例清单本地缓存和BaseLoadBalancer
  3. 当请求发起时,LoadBalancerClient使用BaseLoadBalancer选择一个服务实例
  4. BaseLoadBalancer的负载均衡算法由ILoadBalancer实现,健康检查由IPing实现
  5. 我们可以通过配置NIWSServerListClassNameNFLoadBalancerRuleClassNameNFLoadBalancerPingClassName指定ServerListILoadBalancerIPing的实现类

8. Ribbon的局限性和其它可选组件

尽管Ribbon是一个比较成熟和流行的负载均衡器,但它也存在一定的局限性:

  1. 依赖于服务注册中心,服务注册中心单点故障会影响Ribbon
  2. 只支持基于客户端的负载均衡,不能实现服务端的负载均衡
  3. 缺少对流量控制和熔断的支持,需要与Hystrix结合使用
  4. 无法感知服务实例的实时状态,只能通过设置超时来处理服务实例故障
  5. 配置较为复杂,许多高级特性需要靠yml文件配置实现

除Ribbon外,目前还有其他几种负载均衡器可以选择:

  1. Nginx:Nginx是一个高性能的HTTP和反向代理服务器,也可以用作负载均衡器。Nginx支持基于客户端和服务端的负载均衡,并有丰富的管理界面。但是Nginx不是热点替换,无法感知服务实例实时状态。
  2. HAProxy:HAProxy也是一个流行的开源负载均衡器,支持TCP和HTTP应用程序。它具有丰富的负载均衡算法,并支持热点配置、服务实例健康检查、熔断等功能。但是HAProxy配置比较复杂,没有注册中心的支持。
  3. Spring Cloud Loadbalancer:这是Spring Cloud中的负载均衡器,具有Ribbon的大部分功能,但配置更简单。它支持服务发现和熔断,但只支持Spring Cloud服务。
  4. Envoy:Envoy是一个流行的开源边缘和服务代理,它具有丰富的路由、负载均衡、熔断、健康检查、TLS等功能。Envoy既可以作为边缘代理使用,也可以作为内部服务间的负载均衡器使用。但是Envoy的学习曲线较为陡峭,并且不直接支持服务发现。

综上,如果你的系统已经使用了Spring Cloud,那么首选Spring Cloud Loadbalancer。如果需要更高性能和更强大的功能,可以选择HAProxy或Envoy。如果你的系统比较简单,Nginx也是一个不错的选择。Ribbon由于其局限性,现在已经逐渐被其他负载均衡器取代。

9. Ribbon高级配置(自定义配置)

我们了解到Ribbon的大部分配置都是通过ribbon.<clientName>.*的方式在application.yml文件中完成的。除此之外,Ribbon还有一些高级配置需要编程实现。

自定义负载均衡规则

我们可以实现IRule接口自定义负载均衡规则,例如:

public class CustomRule implements IRule {
    
    @Override
    public Server choose(Object key) {
    
        // 实现自定义选择逻辑
        // ...
    }
}

然后在application.yml中配置:

ribbon:
  CustomConfiguration: 
    NFLoadBalancerRuleClassName: com.example.CustomRule

这将为CustomConfiguration客户端启用我们自定义的CustomRule负载均衡规则。

自定义服务实例选择逻辑

除了负载均衡规则外,我们还可以自定义服务实例选择逻辑。例如:

public class CustomLoadBalancer extends BaseLoadBalancer {
    
    @Override
    public Server chooseServer(Object key) {
    
        // 实现自定义选择逻辑
        // ...
    }
}

然后在RestTemplate中配置:

RestTemplate restTemplate = new RestTemplate();
restTemplate.setLoadBalancer(new CustomLoadBalancer());

这将为通过该RestTemplate发起的请求使用自定义的负载均衡选择逻辑。

自定义服务实例健康检查

我们可以实现IPing接口自定义服务实例健康检查逻辑,例如:

public class CustomPing implements IPing {
    
    @Override
    public boolean isAlive(Server server) {
    
        // 实现自定义健康检查逻辑
        // ...
    }
}

然后在application.yml中配置:

ribbon:
  CustomConfiguration: 
    NFLoadBalancerPingClassName: com.example.CustomPing

这将为CustomConfiguration客户端启用我们自定义的CustomPing健康检查逻辑。

关闭服务实例健康检查

如果我们不希望Ribbon对服务实例进行健康检查,可以将NFLoadBalancerPingClassName配置为com.netflix.loadbalancer.NoOpPing。例如:

ribbon:
  CustomConfiguration: 
    NFLoadBalancerPingClassName: com.netflix.loadbalancer.NoOpPing

这将完全关闭针对CustomConfiguration客户端的服务实例健康检查。

以上就是Ribbon的一些高级配置,我们可以较为灵活的定制Ribbon以满足我们的需求。希望本文能提供一些编程实现Ribbon高级配置的思路和示例。

10. Ribbon与Hystrix的结合使用

Ribbon本身对服务实例熔断支持较弱,但是它可以很好的与Netflix Hystrix结合使用,以实现更加强大的熔断功能。

Hystrix简介

Hystrix是一个针对分布式系统的延迟和容错的开源库,它通过添加延迟容错和断路器等功能帮助分布式系统提高其弹性。Hystrix主要提供了以下功能:

  • 服务降级:当某服务异常不可用时,自动切换到备选服务或返回备选响应。
  • 熔断:当某服务异常不可用达到阈值时,暂时停止访问该服务,避免 cascading failures 问题。
  • 限流:当某服务访问量突然增大时,进行流控避免其不可用。
  • 监控:Hystrix可以实时监控运行指标、配置的改变和等等。
  • 容错:快速失败,减少故障延迟对系统的影响。

使用步骤

  1. 添加依赖
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
  1. 开启Hystrix

在主应用上添加@EnableCircuitBreaker注解开启Hystrix。

  1. 为服务方法添加熔断注解

使用@HystrixCommand注解为服务方法添加熔断功能,例如:

@HystrixCommand(fallbackMethod = "fallbackMethod")
public String serviceMethod() {
    
    // ...
}

public String fallbackMethod() {
    
    return "Fallback response"; 
}

这将为serviceMethod()方法添加熔断功能,当该方法触发熔断时会调用fallbackMethod()方法返回备选响应。

  1. 配置Hystrix

我们可以在application.yml中配置Hystrix的各项参数,详见Hystrix Wiki

  1. 监控Hystrix指标

Hystrix提供了监控指标而可以实时监控熔断状态,这需要结合Hystrix Dashboard使用。

Ribbon与Hystrix的集成

Spring Cloud已经帮助我们将Ribbon和Hystrix进行了很好的集成:

  1. 当使用@LoadBalanced注解的RestTemplate访问某服务失败时,如果该服务已添加Hystrix熔断注解,将自动触发熔断。
  2. 我们可以借助Hystrix的监控平台监控Ribbon客户端的各服务的熔断状态。
  3. 只需要在服务的调用方法上添加@HystrixCommand注解,就可以为Ribbon的服务调用添加熔断功能,无需其他集成配置。

所以,如果需要为Ribbon添加强大的熔断功能,Hystrix是一个很好的选择。它可以和Ribbon完美整合,为服务调用添加熔断、降级、限流等功能。

11. Ribbon最佳实践

在系列文章的最后,我想与大家分享一些使用Ribbon的最佳实践。

合理配置超时时间

Ribbon中的超时配置包括:

  • ConnectTimeout:连接超时时间,建立TCP连接的超时时间。
  • ReadTimeout:读取超时时间,接收服务端响应的超时时间。

这两个超时时间直接关系到Ribbon的容错性能,我们需要根据服务的响应时间来合理设置:

  • ConnectTimeout应略大于服务的ping时间,以防止pong消息丢失被误判为连接失败。
  • ReadTimeout应稍大于服务的正常响应时间,但不应太长,以快速检测到服务异常。

过长的超时时间会导致故障检测变慢,但过短的超时时间会产生误判。所以需要根据实际服务情况合理设置。

开启重试机制

Ribbon的重试机制可以避免短暂的服务故障导致的请求失败,我们应该根据具体业务开启Ribbon的重试功能:

ribbon: 
  MaxAutoRetries: 1        # 最大重试次数
  MaxAutoRetriesNextServer: 1 # 重试下一个服务实例的最大次数

但是重试次数不应设置太高,以免漏掉真正的服务故障。

合理控制刷新服务实例清单的频率

Ribbon定时去服务注册中心刷新服务实例清单,这由NIWSServerListRefreshInterval属性控制,默认30秒。

如果刷新过于频繁,会加大注册中心的压力;但如果刷新不够频繁,Ribbon无法快速感知服务实例的变化。

所以,需要根据服务实例的变化频率来设置这个时间间隔。如果服务实例很稳定,可以设置长一点的时间间隔;如果服务实例经常Changed,这个时间间隔应适当缩短。

一般来说,30秒是一个比较适中的时间间隔。当服务实例发生变化时,也可以调用ServerListUpdater.refresh()方法手动刷新服务实例清单。

开启和监控Hystrix

如果Ribbon与Hystrix结合使用,我们应该:

  1. 为主服务启用Hystrix:@EnableCircuitBreaker
  2. 为关键服务调用方法添加熔断注解:@HystrixCommand
  3. 配置Hystrix线程池、熔断等参数
  4. 通过Hystrix Dashboard监控各服务的熔断状态
  5. 为熔断方法提供降级处理逻辑

这可以让Ribbon实现更加智能和弹性的服务调用。

以上就是一些在实际项目中使用Ribbon的最佳实践,可以让Ribbon工作的更加稳定和高效。在你的项目中,可以根据实际情况选择适用的最佳实践。

12. 总结

OK,本系列文章围绕Ribbon这个流行的负载均衡器进行了全面而深入的学习。主要内容包括:

  1. Ribbon简介:作为Netflix开源的负载均衡器,Ribbon在微服务架构中广泛使用。
  2. Ribbon原理:Ribbon的工作机制,包括定时拉取服务实例清单,使用选择规则选择服务实例等。
  3. Ribbon使用:如何通过RestTemplate和FeignClient结合Ribbon实现负载均衡。
  4. Ribbon配置:Ribbon各种配置,包括超时、重试、负载均衡算法等配置。
  5. 源码分析:分析Ribbon的核心组件源码,如ServerList、ILoadBalancer、LoadBalancerClient等。
  6. Ribbon高级特性:连接池、熔断、手动刷新服务实例清单等高级特性。
  7. Ribbon局限性和替代方案:分析Ribbon的局限性并提供可选的替代负载均衡器。
  8. 高级配置:如何通过编程自定义负载均衡规则、服务实例选择逻辑和健康检查。
  9. Ribbon与Hystrix:如何将Ribbon和Hystrix结合使用以实现智能熔断。
  10. 最佳实践:Ribbon在实际项目中的最佳配置和使用方式。

通过本文的学习,相信你对Ribbon和服务调用都有比较深入的理解。Ribbon作为一个轻量级的负载均衡器,适用于绝大多数的服务体系架构。我希望本教程能真正帮助你掌握Ribbon并在项目中灵活运用。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/zixiao217/article/details/130737166

智能推荐

使用nginx解决浏览器跨域问题_nginx不停的xhr-程序员宅基地

文章浏览阅读1k次。通过使用ajax方法跨域请求是浏览器所不允许的,浏览器出于安全考虑是禁止的。警告信息如下:不过jQuery对跨域问题也有解决方案,使用jsonp的方式解决,方法如下:$.ajax({ async:false, url: 'http://www.mysite.com/demo.do', // 跨域URL ty..._nginx不停的xhr

在 Oracle 中配置 extproc 以访问 ST_Geometry-程序员宅基地

文章浏览阅读2k次。关于在 Oracle 中配置 extproc 以访问 ST_Geometry,也就是我们所说的 使用空间SQL 的方法,官方文档链接如下。http://desktop.arcgis.com/zh-cn/arcmap/latest/manage-data/gdbs-in-oracle/configure-oracle-extproc.htm其实简单总结一下,主要就分为以下几个步骤。..._extproc

Linux C++ gbk转为utf-8_linux c++ gbk->utf8-程序员宅基地

文章浏览阅读1.5w次。linux下没有上面的两个函数,需要使用函数 mbstowcs和wcstombsmbstowcs将多字节编码转换为宽字节编码wcstombs将宽字节编码转换为多字节编码这两个函数,转换过程中受到系统编码类型的影响,需要通过设置来设定转换前和转换后的编码类型。通过函数setlocale进行系统编码的设置。linux下输入命名locale -a查看系统支持的编码_linux c++ gbk->utf8

IMP-00009: 导出文件异常结束-程序员宅基地

文章浏览阅读750次。今天准备从生产库向测试库进行数据导入,结果在imp导入的时候遇到“ IMP-00009:导出文件异常结束” 错误,google一下,发现可能有如下原因导致imp的数据太大,没有写buffer和commit两个数据库字符集不同从低版本exp的dmp文件,向高版本imp导出的dmp文件出错传输dmp文件时,文件损坏解决办法:imp时指定..._imp-00009导出文件异常结束

python程序员需要深入掌握的技能_Python用数据说明程序员需要掌握的技能-程序员宅基地

文章浏览阅读143次。当下是一个大数据的时代,各个行业都离不开数据的支持。因此,网络爬虫就应运而生。网络爬虫当下最为火热的是Python,Python开发爬虫相对简单,而且功能库相当完善,力压众多开发语言。本次教程我们爬取前程无忧的招聘信息来分析Python程序员需要掌握那些编程技术。首先在谷歌浏览器打开前程无忧的首页,按F12打开浏览器的开发者工具。浏览器开发者工具是用于捕捉网站的请求信息,通过分析请求信息可以了解请..._初级python程序员能力要求

Spring @Service生成bean名称的规则(当类的名字是以两个或以上的大写字母开头的话,bean的名字会与类名保持一致)_@service beanname-程序员宅基地

文章浏览阅读7.6k次,点赞2次,收藏6次。@Service标注的bean,类名:ABDemoService查看源码后发现,原来是经过一个特殊处理:当类的名字是以两个或以上的大写字母开头的话,bean的名字会与类名保持一致public class AnnotationBeanNameGenerator implements BeanNameGenerator { private static final String C..._@service beanname

随便推点

二叉树的各种创建方法_二叉树的建立-程序员宅基地

文章浏览阅读6.9w次,点赞73次,收藏463次。1.前序创建#include&lt;stdio.h&gt;#include&lt;string.h&gt;#include&lt;stdlib.h&gt;#include&lt;malloc.h&gt;#include&lt;iostream&gt;#include&lt;stack&gt;#include&lt;queue&gt;using namespace std;typed_二叉树的建立

解决asp.net导出excel时中文文件名乱码_asp.net utf8 导出中文字符乱码-程序员宅基地

文章浏览阅读7.1k次。在Asp.net上使用Excel导出功能,如果文件名出现中文,便会以乱码视之。 解决方法: fileName = HttpUtility.UrlEncode(fileName, System.Text.Encoding.UTF8);_asp.net utf8 导出中文字符乱码

笔记-编译原理-实验一-词法分析器设计_对pl/0作以下修改扩充。增加单词-程序员宅基地

文章浏览阅读2.1k次,点赞4次,收藏23次。第一次实验 词法分析实验报告设计思想词法分析的主要任务是根据文法的词汇表以及对应约定的编码进行一定的识别,找出文件中所有的合法的单词,并给出一定的信息作为最后的结果,用于后续语法分析程序的使用;本实验针对 PL/0 语言 的文法、词汇表编写一个词法分析程序,对于每个单词根据词汇表输出: (单词种类, 单词的值) 二元对。词汇表:种别编码单词符号助记符0beginb..._对pl/0作以下修改扩充。增加单词

android adb shell 权限,android adb shell权限被拒绝-程序员宅基地

文章浏览阅读773次。我在使用adb.exe时遇到了麻烦.我想使用与bash相同的adb.exe shell提示符,所以我决定更改默认的bash二进制文件(当然二进制文件是交叉编译的,一切都很完美)更改bash二进制文件遵循以下顺序> adb remount> adb push bash / system / bin /> adb shell> cd / system / bin> chm..._adb shell mv 权限

投影仪-相机标定_相机-投影仪标定-程序员宅基地

文章浏览阅读6.8k次,点赞12次,收藏125次。1. 单目相机标定引言相机标定已经研究多年,标定的算法可以分为基于摄影测量的标定和自标定。其中,应用最为广泛的还是张正友标定法。这是一种简单灵活、高鲁棒性、低成本的相机标定算法。仅需要一台相机和一块平面标定板构建相机标定系统,在标定过程中,相机拍摄多个角度下(至少两个角度,推荐10~20个角度)的标定板图像(相机和标定板都可以移动),即可对相机的内外参数进行标定。下面介绍张氏标定法(以下也这么称呼)的原理。原理相机模型和单应矩阵相机标定,就是对相机的内外参数进行计算的过程,从而得到物体到图像的投影_相机-投影仪标定

Wayland架构、渲染、硬件支持-程序员宅基地

文章浏览阅读2.2k次。文章目录Wayland 架构Wayland 渲染Wayland的 硬件支持简 述: 翻译一篇关于和 wayland 有关的技术文章, 其英文标题为Wayland Architecture .Wayland 架构若是想要更好的理解 Wayland 架构及其与 X (X11 or X Window System) 结构;一种很好的方法是将事件从输入设备就开始跟踪, 查看期间所有的屏幕上出现的变化。这就是我们现在对 X 的理解。 内核是从一个输入设备中获取一个事件,并通过 evdev 输入_wayland

推荐文章

热门文章

相关标签