首页 > 其他分享 >(转)微服务注册中心:Consul——服务发现

(转)微服务注册中心:Consul——服务发现

时间:2023-05-30 23:44:48浏览次数:43  
标签:服务 spring Consul 注册 org consul cloud

原文:https://xie.infoq.cn/article/4fe6f02b220fb009844861b56

https://www.cnblogs.com/myitnews/p/13655000.html

一 概述

说完了 Consul 的服务注册,那么就该到服务发现了。大家有过 rpc 框架使用经验的,例如 nacos、eureka、dubbo 等,就会了解服务中的角色,也就是生产者和消费者,也可以理解为服务的提供方和服务使用方。服务注册,是服务提供方把自己的信息(ip、端口、方法、参数 &返回值信息)注册到一个中心;服务发现就是服务使用方,从中心获取到可用的服务提供方信息,并像本地方法调用一样调用其方法(远程方法),这也就是 RPC(远程方法调用)的过程。

二 Consul 宏观架构

这里先说一下 consul 的架构,Consul 的宏观架构如下图所示:

 

其中"DATACENTER1"和 “DATACENTER2”代表两个数据中心(Consul 对多数据中心天然有比较好的支持)。

在每个数据中心内有 Client 和 Server 的混合。通常我们会部署 3~5 台 Server。具体数量由可用性和性能之间取得平衡,因为随着机器的增加,共识的速度会逐渐变慢。不过对 Client 的数量通常没有限制,可以轻松地扩展到数千或数万的量级。

所有在数据中心的代理都会参与一个 Gossip 协议,这意味着有一个 Gossip 池,其中包含了某个数据中心的所有 Agent。这有几个目的:

  • 第一,客户端不需要配置 Server 的地址,发现工作是自动完成的。

  • 第二,检测代理故障的工作不放在 Server 上,而是分布式的。这使得故障检测的扩展性比原生的心跳方案要强得多。同时,它还为节点提供了故障检测,如果代理无法到达,那么该节点可能已经发生了故障。

  • 第三,它被用作消息层,当发生重要事件(如 Leader 选举)时进行通知。

每个数据中心的 Server 都是单一 Raft 对等集的一部分。这意味着它们共同选出一个单一的 Leader,一个被选中的 Server,它有额外的职责。Leader 负责处理所有查询和事务。事务也必须复制到所有参与共识协议的分片。由于这一要求,当 None-Leader Server 收到 RPC 请求时,它会将其转发给集群 Leader。

一般情况下,不同的 Consul 数据中心之间不会复制数据。当对另一个数据中心的资源进行请求时,本地 Consul 服务器会将该资源的 RPC 请求转发给远程 Consul 服务器,并返回结果。如果远程数据中心不可用,那么这些资源也将不可用,但这不会以其他方式影响本地数据中心。

三 Consul 服务发现

3.1 Consul 已注册服务查看

大概了解了 Consul 的架构,接下来回到本篇的主题,我们先搞清楚怎样获取到已注册的服务,来供调用。

如果还不了解服务注册怎样实现,大家先再看一下这篇文章:微服务注册中心:Consul——服务注册,可以直接拉取 gitee 代码到本地,本地启动 Consul 服务后,再启动 springboot-consul 下的 SpringBootConsulApplication,即可完成注册。注意一下 consul 服务端口,默认使用的是 8500。

 

如果上述操作完成且没有问题,那么我们在浏览器中查看 http://localhost:8500/,可以看到 Consul 下的 Services 信息如下:

会有两个 Service,一个是 consul——这个是 Consul 服务启动后就有的,自带的 service; 下面的 first-consul-client 就是我们启动并注册的服务。

3.2 建立消费者工程

3.2.1 创建工程

创建一个名为 springboot-consul-consumer 的 maven 工程。

3.2.2 依赖配置

主要是 spring-cloud,spring boot,以及 spring-cloud-starter-consul-discovery,用于做 consul 的服务发现。pom.xml 内容如下:

 

<properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <project.version>1.0.0</project.version> <java.version>1.8</java.version> <spring-cloud.version>Finchley.RELEASE</spring-cloud.version> </properties>
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-hystrix-dashboard</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-consul-discovery</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies>
<dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>${spring-cloud.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>
      复制代码  

3.2.3 application 属性配置

这里尝试使用 application.yml,zipkin 不是必须,所以暂时注释掉:

 
server:  port: 8521spring:  application:    name: spring-cloud-consul-consumer  cloud:    consul:      host: localhost      port: 8500      discovery:        serviceName: ${spring.application.name}	# 注册到consul的服务名称  #  zipkin:  #    base-url: http://localhost:9411/  sleuth:    sampler:      probability: 1 #样本采集量,默认为0.1,为了测试这里修改为1,正式环境一般使用默认值#ribbon 负载均衡策略配置, service-producer为注册的服务名service-producer:  ribbon:    NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RoundRobinRule#开启熔断器feign:  hystrix:    enabled: true
      复制代码  

 

3.2.4 核心代码

1)必不可少的启动文件 ConsulConsumerApplication:

 

@EnableFeignClients@EnableDiscoveryClient@SpringBootApplicationpublic class ConsulConsumerApplication {
public static void main(String[] args) { SpringApplication.run(ConsulConsumerApplication.class, args); }
@Bean @LoadBalanced public RestTemplate restTemplate() { return new RestTemplate(); }
// 此配置是为了服务监控而配置,与服务容错本身无关, // ServletRegistrationBean因为springboot的默认路径不是"/hystrix.stream", // 只要在自己的项目里配置上下面的servlet就可以了 @Bean public ServletRegistrationBean getServlet() { HystrixMetricsStreamServlet streamServlet = new HystrixMetricsStreamServlet(); ServletRegistrationBean registrationBean = new ServletRegistrationBean(streamServlet); registrationBean.setLoadOnStartup(1); registrationBean.addUrlMappings("/hystrix.stream"); registrationBean.setName("HystrixMetricsStreamServlet"); return registrationBean; }
}
      复制代码  

2)访问服务方法

 


import org.springframework.beans.factory.annotation.Autowired;import org.springframework.cloud.client.discovery.DiscoveryClient;import org.springframework.cloud.client.loadbalancer.LoadBalancerClient;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RestController;
@RestControllerpublic class ServiceController {
@Autowired private LoadBalancerClient loadBalancerClient; @Autowired private DiscoveryClient discoveryClient;
private String serviceId = "first-consul-client";
/** * 获取所有服务 */ @RequestMapping("/services") public Object services() { return discoveryClient.getInstances(serviceId); }
/** * 从所有服务中选择一个服务(轮询) */ @RequestMapping("/discover") public Object discover() { return loadBalancerClient.choose(serviceId).getUri().toString(); }}
      复制代码  

至此,工程建立完毕。可见,核心逻辑还是在引入的依赖包 spring-cloud-starter-consul-discovery 中。consul 服务配置在了 application.yml 中的 consul 属性,controller 中通过设置的 serviceId 来定位我们要使用的服务。

 

3.3 启动验证

启动 ConsulConsumerApplication,完成后,通过/services 来验证是否能够获取到服务列表,浏览器中输入: http://localhost:8521/services,返回信息为:

可见确实得到了预期的结果。

再次查看 Consul 的 ui 页面(http://localhost:8500/ui/dc1/services):

标红的就是我们刚刚启动的消费者,也注册到了 Consul 的 services 列表中。

上述代码已提交至 gitee: https://gitee.com/flamingskyline/spring-boot-integration,可自行拉取并做调整。

四 小结

至此,我们从本地安装启动 Consul,到服务注册和发现,可以简单的使用起来了,但还是非常简单的应用,并未深入到原理和架构,后面的文章中,将会对其原理进行分析,敬请期待。

标签:服务,spring,Consul,注册,org,consul,cloud
From: https://www.cnblogs.com/liujiacai/p/17444858.html

相关文章

  • 使用Ansible 收集服务器元数据信息到CMDB数据库
    安装必要组件:pipinstallansible-cmdbyuminstall-ymariadbMySQL-python创建一个Ansibleplaybook文件,例如collect_facts.yml,并添加以下内容:-name:CollectserverfactsintoCMDBhosts:allgather_facts:truebecome:truevars:db_host:"192.168.0......
  • 浪潮信息入围Gartner全球服务器标杆厂商 多项能力获得认可
    近日,Gartner发布全球服务器市场指南《MarketGuideforServers》,从市场定义、市场方向、市场规模等角度对全球服务器厂商进行全面评估与研究,并甄选出代表性厂商,是全球用户进行服务器选型的重要参考和依据。浪潮信息入围全球服务器标杆厂商,在液冷、开放计算等多方面能力获得高度认......
  • git 注册GitHub账号:011
    打开git官网注册地址:https://github.com/login?return_to=https%3A%2F%2Fgithub.com%2Fsignup%3Fref_cta%3DSign%2Bup%26ref_loc%3Dheader%2Blogged%2Bout%26ref_page%3D%252F%26source%3Dheader-home在注册过程中,有些步骤我跳过了,根据提示来操作就行      ......
  • consul的入门实例
    Consul是一个开源的分布式服务发现和配置管理系统,由HashiCorp开发。它提供了服务注册与发现、健康检查、KV存储、多数据中心支持等功能,旨在简化分布式系统的构建和管理。Consul的入门实例主要涉及以下步骤:准备工作:安装Consul:根据您的操作系统,从Consul官方网站下载并安装Cons......
  • 《可伸缩服务架构-框架与中间件》-00-随笔计划
    初步计划大约花费9*5天时间精细阅读本书。目标输出:每个篇章输出一篇随笔,分析架构和逻辑内容。第一章:分布式发号器(5月31号--6月4号)第二章:消息队列(6月5号--6月9号)第三章:数据库分库分表(6月10号--6月14号)第四章:缓存(6月15号--6月19号)第五章:ES(6月20号--6月24号)第六章:定制任务(6月2......
  • 《可伸缩服务架构-框架与中间件》-01-分布式发号器
    本文主要是设计一款永不重复的高性能分布式发号器。源码地址——码云:https://gitee.com/robertleepeak/vesta-id-generatorVesta是一款通用的ID产生器,互联网俗称统一发号器,它具有全局唯一、粗略有序、可反解和可制造等特性,它支持三种发布模式:嵌入发布模式、中心服务器发布模式、......
  • 云服务器与独立服务器的性能比较:您需要了解的关键差异
    在当今数字化时代,企业和个人都需要可靠的服务器来托管其网站和应用程序。但在选择服务器时,很多人会面临一个关键问题:是选择云服务器还是独立服务器?这两种服务器类型在性能和功能方面存在差异,本文将探讨云服务器和独立服务器之间的关键差异,以帮助您做出明智的选择。一、成......
  • 在树莓派上使用numpy实现简单的神经网络推理,pytorch在服务器或PC上训练好模型保存成nu
    这几天又在玩树莓派,先是搞了个物联网,又在尝试在树莓派上搞一些简单的神经网络,这次搞得是mlp识别mnist手写数字识别训练代码在电脑上,cpu就能训练,很快的:1importtorch2importtorch.nnasnn3importtorch.optimasoptim4fromtorchvisionimportdatasets,transfor......
  • windows web服务器代码移植到linux所采的坑
    windowsweb服务器代码移植到linux所采的坑一、导入问题不能直接将编译后的class文件放入linux服务器中,虽说java是跨平台性好,但是windows下的class文件是不能在linux下直接运行的.二、编译问题1.编码问题在linux端编译代码时,最先遇到的就是编码问题,默认是按ACSII码编译的,不行......
  • java服务端如何接入WebSocket?
    日常工作中,我们都是使用http请求,来进行前后交互,那么我们也会有使用websocket来进行前后交互的时候,那么它俩有什么区别呢?http和websocket区别WebSocket是双向通信协议,模拟Socket协议,可以双向发送或接受信息HTTP是单向的WebSocket是需要浏览器和服务器握手进行建立连接的而http......