微服务的服务注册与发现实践示例分析

发布时间:2022-02-07 15:07:48 作者:iii
来源:亿速云 阅读:138

本文小编为大家详细介绍“微服务的服务注册与发现实践示例分析”,内容详细,步骤清晰,细节处理妥当,希望这篇“微服务的服务注册与发现实践示例分析”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。

1 服务注册中心

前面我们对业内几种比较常见的注册中心做了介绍:Eureka、Zookeeper、Consul、Etcd。

并且在各个指标上做了对比:注册方式(watch\polling)、健康检查、雪崩保护、安全与权限,以及在Spring Cloud、Dubbo、Kubernets上的支持程度。方便我们在不同的场景下做正确的技术选型。

4种注册中心技术对比

指标EurekaZookeeperConsulEtcd
一致性协议APCP(Paxos算法)CP(Raft算法)CP(Raft算法)
健康检查TTL(Time To Live)TCP Keep AliveTTL\HTTP\TCP\ScriptLease TTL KeepAlive
watch/long polling不支持watchlong pollingwatch
雪崩保护支持不支持不支持不支持
安全与权限不支持ACLACLRBAC
是否支持多数据中心
是否有管理界面否(可用第三方ZkTools)
Spring Cloud 集成支持支持支持支持
Dubbo 集成不支持支持支持不支持
K8S 集成不支持不支持支持支持

我们可以看出,四种技术类型对Spring Cloud的支持度都很高。Spring Cloud是微服务架构的一站式解决方案,我们平时构建微服务的过程中需要做的的如 配置管理、服务发现、负载均衡、断路器、智能路由、控制总线、全局锁、决策竞选、分布式会话和集群状态管理等操作。Spring Cloud 为我们提供了一套简易的编程模型,使我们能在 Spring Boot 的基础上轻松地实现微服务项目的构建。

Spring Cloud包含了多个不同开源产品,来保证一站式的微服务解决方案,如:Spring Cloud Config、Spring Cloud Netflix、Spring Cloud Security、Spring Cloud Commons、Spring Cloud Zookeeper、Spring Cloud CLI等项目。

2 Spring Cloud 框架下实现

Spring Cloud为服务治理做了一层抽象,这样能够支持多种不同的服务治理框架,比如:Netflix Eureka、Consul。我们这边就以这两个为例子,看看服务治理是如何实现。

在Spring Cloud服务治理抽象层的作用下,可以无缝地切换服务治理实现,且不影响任何其他的服务注册、发现、调用逻辑。

所以,下面我们通过介绍这两种服务治理的实现来体会Spring Cloud这一层抽象所带来的好处。

2.1 Spring Cloud Eureka

Spring Cloud Eureka是Spring Cloud Netflix项目下的服务治理模块。而Spring Cloud Netflix项目是Spring Cloud的子项目之一,主要内容是对Netflix公司一系列开源产品的包装,它为Spring Boot应用提供了自配置的Netflix OSS整合。

通过一些简单的注解,开发者就可以快速的在应用中配置一下常用模块并构建庞大的分布式系统。它主要提供的模块包括:服务发现(Eureka),断路器(Hystrix),智能路由(Zuul),客户端负载均衡(Ribbon)等。

下面,就来具体看看如何使用Spring Cloud Eureka实现服务治理。

2.1.1 创建注册中心

创建一个Spring Cloud项目,我们命名为micro-service-center,并在pom.xml中引入需要的依赖内容:

<packaging>pom</packaging>

表明这个项目中可以没有Java代码,也不执行任何代码,只是为了聚合工程或者传递依赖,所以可以把src文件夹删了。这是一个父级项目,因为我们还要在下面建立Eureka的注册中心、客户端等多个子项目 。

在micro-service-center下,新建一个命名为 eureka-service 的Module,依旧是Spring Cloud 项目,建完之后,pom.xml做如下改动:

 <!--    在子工程中添加父工程名称-->
 <parent>
      <groupId>com.microservice</groupId>
      <artifactId>center</artifactId>
      <version>1.0.0</version>
 </parent>
  
  
  <dependencies>
 <!--   加入 eureka 服务 -->
         <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-netflix-eureka-server</artifactId>
          </dependency>
 </dependencies>

改完之后,回到父项目micro-service-center,修改pom中的信息:

<groupId>com.microservice</groupId>
  <artifactId>center</artifactId>
  <packaging>pom</packaging>
  <version>1.0.0</version>
  <name>center</name>
  <description>Demo project for Spring Boot</description>
  <!--    在父工程添加子工程名称-->
  <modules>
    <module>eureka-service</module>
    <module>eureka-client</module>
  </modules>

对两个项目进行clean + install,应该是成功的。

eureka-service我们是作为注册中心来用的,所以在它的主类Application中加入@EnableEurekaServer注解,就能开启注册中心功能。

 @SpringBootApplication
 @EnableEurekaServer
 public class ServiceApplication {
     public static void main(String[] args) {
         SpringApplication.run(ServiceApplication.class, args);
         System.out.println("Start Eureka Service");
     }

但是默认情况下,该注册中心也会把自己当做客户端,那就变成自己注册自己了,这个是可以剔除的,我们看一下它的YAML中的详细配置,注释比较清楚:

server:
   port: 1000
 spring:
   application:
     name: eureka-server
 eureka:
   instance:
     hostname: localhost
   client:
     register-with-eureka: false  # 不作为客户端进行注册
     fetch-registry: false  # 不获取注册列表
     service-url:  # 注册地址,客户端需要注册到该地址中
       defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/

文中的注释还是比较清楚的。 这边可以看到,端口号是1000,所以当工程启动之后,访问 http://localhost:1000/ 是可以看到Eureka注册中心页面的。其中还没有发现任何服务。

微服务的服务注册与发现实践示例分析

2.1.2 创建客户端

目前服务中心还是空的,所以我们创建一个能够提供服务的客户端,并将其注册到注册中心去。

同样的,我们创建一个Spring Cloud的子项目,命名为eureka-clientpom.xml中的配置如下:

<!--    在子工程中添加父工程名称-->
 <parent>
     <groupId>com.microservice</groupId>
     <artifactId>center</artifactId>
     <version>1.0.0</version>
 </parent>
 <dependencies>
 
 <!--    加入 eureka 服务 -->
 <dependency>
     <groupId>org.springframework.cloud</groupId>
     <artifactId>spring-cloud-netflix-eureka-server</artifactId>
 </dependency>
 
 <dependency>
     <groupId>org.projectlombok</groupId>
     <artifactId>lombok</artifactId>
 </dependency>
 
 </dependencies>

在应用主类Application文件中通过加上@EnableDiscoveryClient注解,该注解保证当前服务被Eureka当成provider发现。

 @SpringBootApplication
 @EnableDiscoveryClient
 public class ClientApplication {
     public static void main(String[] args) {
         SpringApplication.run(ClientApplication.class, args);
         System.out.println("start client!");
     }

在YAML文件上加上如下配置:

 server:
   port: 1001
 spring:
   application:
     name: eureka-client
 eureka:
   client:
     service-url:  # 这边就保证了注册到 eureka-service 这个注册中心去
       defaultZone: http://localhost:1000/eureka

spring.application.name属性,指定了微服务的名称,在调用的时候可以通过该名称进行服务访问。eureka.client.serviceUrl.defaultZone属性对应服务注册中心的配置内容,指定服务注册中心的位置。

大家看到,这边端口设置为1001,那是因为要在本机上测试 服务提供方 和 服务注册中心,所以server的port属性需设置不同的端口。

最后,我们再写一个接口,通过DiscoveryClient对象,在客户端中获取注册中心的所有服务信息。

@Controller
 @RequestMapping("/eurekacenter")
 public class EuServiceController {
     @Autowired
     DiscoveryClient discoveryClient;
     /**
      * 获取注册服务信息
      */
     @RequestMapping(value = "/service", method = {RequestMethod.GET})
     @ResponseBody
     public String getServiceInfo() {
        return  "service:"+discoveryClient.getServices()+" , memo:"+discoveryClient.description();
     }

这时候跑一下试试看,继续访问之前的地址:http://localhost:1000/ ,可以看到Eureka注册中心页面已经包含一个我们定义的服务了,就是上面新建的 1001 端口的服务。

微服务的服务注册与发现实践示例分析

同样,我们可以调用上面的那个获取注册服务信息的接口,从服务发现的角度看看有多少个服务被注册到注册中心去。 http://localhost:1001/eurekacenter/service

微服务的服务注册与发现实践示例分析

如上图所示,方括号中的eureka-client通过Spring Cloud定义的 getServiceInfo 接口在eureka的实现中获取到的所有服务清单,他是一个String的List,如果注册了多个提供者,就会全部显示。

2.2 Spring Cloud Consul

Consul 用于实现分布式系统的服务发现与配置。与其它分布式服务注册与发现的方案,Consul 的方案更具“一站式”特征,内置了服务注册与发现框 架、分布一致性协议实现、健康检查、Key/Value 存储、多数据中心方案,不再需要依赖其它工具(比如 ZooKeeper 之类的)。

而Spring Cloud Consul ,是将其作为一个整体,在微服务架构中为我们的基础设施提供服务发现和服务配置的工具。

2.2.1 Consul 的优势
2.2.2 Consul的特性
2.2.3 安装Consul注册中心

1、官方下载64版本 :https://www.consul.io/downloads.html

2、解压后复制到目录 /usr/local/bin 下

3、启动终端,先看下啥版本的

 wengzhihua@B000000147796DS ~ % consul --version
 Consul v1.10.4
 Revision 7bbad6fe
 Protocol 2 spoken by default, understands 2 to 3 (agent will automatically use protocol >2 when speaking to compatible agents)

4、执行安装命令,可以看到他的 Client Addr 的端口为8500。所以访问 8500端口站点,http://127.0.0.1:8500/ui/dc1/services

wengzhihua@B000000147796DS ~ % consul agent -dev
 ==> Starting Consul agent...
            Version: '1.10.4'
            Node ID: '6db154b4-62ff-e67d-e745-1a7270fa1ce8'
          Node name: 'B000000147796DS'
         Datacenter: 'dc1' (Segment: '<all>')
             Server: true (Bootstrap: false)
        Client Addr: [127.0.0.1] (HTTP: 8500, HTTPS: -1, gRPC: 8502, DNS: 8600)
       Cluster Addr: 127.0.0.1 (LAN: 8301, WAN: 8302)
            Encrypt: Gossip: false, TLS-Outgoing: false, TLS-Incoming: false, Auto-Encrypt-TLS: false

微服务的服务注册与发现实践示例分析

我们可以看到,现在没有客户端注册上来,只有一个自身的实例。

2.2.4 创建服务提供者

由于Spring Cloud Consul项目的实现,我们可以轻松的将基于Spring Boot的微服务应用注册到Consul上,并通过此实现微服务架构中的服务治理。

我们在micro-service-center下新建一个cloud项目consul-client,该项目pom文件添加如下:

<!--    在子工程中添加父工程名称-->
 <parent>
     <groupId>com.microservice</groupId>
     <artifactId>center</artifactId>
     <version>1.0.0</version>
 </parent>
 
 <dependencies>
 <!--        Consul服务发现-->
 <dependency>
     <groupId>org.springframework.cloud</groupId>
     <artifactId>spring-cloud-starter-consul-discovery</artifactId>
 </dependency>
 <!--        Consul健康检查-->
 <dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-actuator</artifactId>
 </dependency>
 </dependencies

然后修改一下application.yml的配置信息,将consul配置写入,注释应该很清楚了,如下:

spring:
  application:
    name: consul-producer # 当前服务的名称
  cloud:
    consul: # 以下为Consuk注册中心的地址,如果安装的不是这个host和port,这边可以调整
      host: localhost
      port: 8500
server:
  port: 8501 # 当前服务的端口

同样的,我们要在应用主类Application文件中通过加上@EnableDiscoveryClient注解,该注解保证当前服务被Consul当成provider发现。

大家看到这个做法跟Eureka一样,因为Spring Cloud对服务治理做的一层抽象,所以可以屏蔽Eureka和Consul服务治理的实现细节,

程序上不需要做改变,只需要引入不同的服务治理依赖,并配置相关的配置属性 就能轻松的将微服务纳入Spring Cloud的各个服务治理框架中。

 @SpringBootApplication
 @EnableDiscoveryClient
 public class ConsulClientApplication {
     public static void main(String[] args) {
         SpringApplication.run(ClientApplication.class, args);
     }
 }

修改完成之后,我们就可以把这个服务提供者启动了,然后再去注册中心查看服务的注册情况,就可以看到被注册进来的Provider(consul-producer):

微服务的服务注册与发现实践示例分析

读到这里,这篇“微服务的服务注册与发现实践示例分析”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注亿速云行业资讯频道。

推荐阅读:
  1. 服务注册与发现—Eureka (服务管理)
  2. SpringCloud微服务(01):Eureka组件,管理服务注册与发现

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

微服务

上一篇:C#中间语言及ILDASM工具怎么使用

下一篇:WPF怎么使用AForge调用摄像头

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》