微服务架构之服务注册与发现实践示例详解

目录
  • 1 服务注册中心
    • 4种注册中心技术对比
  • 2 Spring Cloud 框架下实现
    • 2.1 Spring Cloud Eureka
      • 2.1.1 创建注册中心
      • 2.1.2 创建客户端
    • 2.2 Spring Cloud Consul
      • 2.2.1 Consul 的优势
      • 2.2.2 Consul的特性
      • 2.2.3 安装Consul注册中心
      • 2.2.4 创建服务提供者
  • 3 总结

微服务系列前篇

详解微服务架构及其演进史

微服务全景架构全面瓦解

微服务架构拆分策略详解

微服务架构之服务注册与发现功能详解

1 服务注册中心

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

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

4种注册中心技术对比

指标 Eureka Zookeeper Consul Etcd
一致性协议 AP CP(Paxos算法) CP(Raft算法) CP(Raft算法)
健康检查 TTL(Time To Live) TCP Keep Alive TTL\HTTP\TCP\Script Lease TTL KeepAlive
watch/long polling 不支持 watch long polling watch
雪崩保护 支持 不支持 不支持 不支持
安全与权限 不支持 ACL ACL RBAC
是否支持多数据中心
是否有管理界面 否(可用第三方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 的优势

  • 1、使用 Raft 算法来保证一致性, 比复杂的 Paxos 算法更直接。
  • 2、支持多数据中心,内外网的服务采用不同的端口进行监听。 多数据中心集群可以避免单数据中心的单点故障,而其部署则需要考虑网络延迟, 分片等情况等。 zookeeper 和 etcd 均不提供多数据中心功能的支持,上面表格中有体现。
  • 3、支持健康检查。
  • 4、支持 http 和 dns 协议接口。 zookeeper 的集成较为复杂, etcd 只支持 http 协议。
  • 5、官方提供 web 管理界面, etcd 无此功能。

2.2.2 Consul的特性

  • 1、服务发现
  • 2、健康检查
  • 3、Key/Value存储
  • 4、多数据中心

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):

3 总结

除了 Eureka、Consul,还有其他的的注册中心技术,如Zookeeper、Nocas等。但无论何种注册中心技术,本质上都是为了解决微服务中的如下问题:

解耦服务之间相互依赖的细节

我们知道服务之间的远程调用必须要知道对方的IP、端口信息。我们可以在调用方直接配置被调用方的IP、端口,这种调用方直接依赖IP、端口的方式存在明显的问题,如被调用的IP、端口变化后,调用方法也要同步修改。

通过服务发现,将服务之间IP与端口的依赖转化为服务名的依赖,服务名可以根据具微服务业务来做标识,因此,屏蔽、解耦服务之间的依赖细节是服务发现与注册解决的第一个问题。

对微服务进行动态管理

在微服务架构中,服务众多,服务之间的相互依赖也错综复杂,无论是服务主动停止,意外挂掉,还是因为流量增加对服务实现进行扩容,这些服务数据或状态上的动态变化,都需要尽快的通知到被调用方,被调用方才采取相应的措施。因此,对于服务注册与发现要实时管理者服务的数据与状态,包括服务的注册上线、服务主动下线,异常服务的剔除。

以上就是微服务架构之服务注册与发现实践示例详解的详细内容,更多关于微服务注册与发现实践的资料请关注我们其它相关文章!

(0)

相关推荐

  • 微服务全景架构全面瓦解

    目录 1 微服务优势与挑战 1.1 微服务的优势 1.1.1 单一职责 1.1.2 轻量级通信 1.1.3 独立性 1.1.4 进程隔离 1.1.5 混合技术栈和混合部署方式 1.1.6 简化治理 1.1.7 安全可靠,可维护. 1.2 面临的挑战 1.2.1 分布式固有复杂性 1.2.2 服务的依赖管理和测试 1.2.3 有效的配置版本管理 1.2.4 自动化的部署流程 1.2.5 对于DevOps更高的要求 1.2.6 运维成本 2 微服务全景架构 3 微服务核心组件 3.1 服务注册与发现

  • 微服务架构之服务注册与发现功能详解

    目录 微服务的注册与发现 1.服务注册 2.服务发现 3.注册中心 4.现下的主流注册中心 4.1 Eureka 4.1.1 介绍 4.1.2 整体架构 4.1.3 接入Spring Cloud 4.2 ZooKeeper 4.2.1 介绍 4.2.2 整体架构 4.2.3 接入Dubbo生态 4.3 Consul 4.3.1 介绍 4.3.2 整体架构 4.3.3 生态对接 4.4 总结对比 详解微服务架构及其演进史 微服务全景架构全面瓦解 微服务架构拆分策略详解 微服务的注册与发现 我们前面

  • 微服务架构拆分策略详解

    目录 1 微服务迁移准备 2 微服务颗粒的拆分策略 2.1 基于业务逻辑拆分 2.1.1 领域模型拆分 2.1.2 用户群体拆分 2.2 基于可扩展拆分 2.3 基于可靠性拆分 2.3.1 核心模块拆分 2.3.2 主次链路拆分 2.4 基于性能需求拆分 3 总结拆分原则 微服务架构及其演进史 微服务全景架构全面瓦解 前面我们学习了微服务的全景架构,了解到相对于传统单体架构,微服务的优势,以及系统服务化的发展趋势. 对于新启动的项目,我们在权衡之后可以大方的使用微服务架构.但其实大部分情况下,我

  • 详解Java 微服务架构

    一.传统的整体式架构 传统的整体式架构都是模块化的设计逻辑,如展示(Views).应用程序逻辑(Controller).业务逻辑(Service)和数据访问对象(Dao),程序在编写完成后被打包部署为一个具体的应用.如图所示: 系统的水平扩展 如果要对系统进行水平扩展,通常情况下,只需要增加服务器的数量,并将打包好的应用拷贝到不同的服务器,然后通过负载均衡器(Nginx)就可以轻松实现应用的水平扩展. 整体式架构的缺点 应用复杂度增加,更新.维护困难. 易造成系统资源浪费. 影响开发效率. 应用

  • 微服务和分布式的区别详解

    分布式架构是分布式计算技术的应用和工具,目前成熟的技术包括J2EE, CORBA和.NET(DCOM),这些技术牵扯的内容非常广,相关的书籍也非常多,也没有涉及这些技术的细节,只是从各种分布式系统平台产生的背景和在软件开发中应用的情况来探讨它们的主要异同. 微服务架构是一项在云中部署应用和服务的新技术.大部分围绕微服务的争论都集中在容器或其他技术是否能很好的实施微服务,而红帽说API应该是重点. 微服务可以在"自己的程序"中运行,并通过"轻量级设备与HTTP型API进行沟通&

  • 详解微服务架构及其演进史

    目录 1 传统单体系统介绍 1.1 单体系统的问题 1.2 单体系统的优点 1.3 单体服务到微服务的发展过程 2 关于微服务 2.1 单一职责 2.2 轻量级通信 2.3 独立性 2.4 进程隔离 2.5 混合技术栈和混合部署方式 2.6 简化治理 2.7 安全可靠,可维护. 3 微服务演进史 3.1 第一阶:简单服务通信模块 3.2 第二阶:原始通信时代 3.3 第三阶:TCP时代 3.4 第四阶:第一代微服务(Spring Cloud/RPC) 3.5 第五阶:第二代微服务 3.6 第六阶

  • 微服务架构之服务注册与发现实践示例详解

    目录 1 服务注册中心 4种注册中心技术对比 2 Spring Cloud 框架下实现 2.1 Spring Cloud Eureka 2.1.1 创建注册中心 2.1.2 创建客户端 2.2 Spring Cloud Consul 2.2.1 Consul 的优势 2.2.2 Consul的特性 2.2.3 安装Consul注册中心 2.2.4 创建服务提供者 3 总结 微服务系列前篇 详解微服务架构及其演进史 微服务全景架构全面瓦解 微服务架构拆分策略详解 微服务架构之服务注册与发现功能详解

  • Spring Cloud Eureka 注册与发现操作步骤详解

    在搭建Spring Cloud Eureka环境前先要了解整个架构的组成,常用的基础模式如下图: 服务提供者:将springboot服务编写好以后,通过配置注册中心地址方式注册,提供给消费者使用. 注册中心:服务的中间桥梁,服务提供者将服务注册.服务消费者可以通过注册信息调用需要使用的服务. 服务消费者:通过规定的调用方式,读取注册中心的注册信息,调用相应的服务. 根据后续的服务复杂度进化以后,可以看到服务提供者也可以是服务消费者,服务消费者也可以是服务提供者.根据不同的业务情况是可以互相调用的

  • SpringCloud服务的发现与调用详解

    目录 前言 一.服务提供者 二.服务消费者 总结 相关推荐 上一章:Eureka注册中心 前言 上一章中,我们介绍了Eureka注册中心及集群的搭建,这一节将介绍服务的发现和调用.注意,这个时候我们只有注册中心,并没有引入其他的组件,所以需要使用SpringCloud原生态的服务发现和调用的方式实现,循序渐进的带你走入微服务的世界. 上篇文章我们已经创建好了注册中心,这次我们需要创建一个服务提供者(provider)和一个服务消费者(consumer)两个项目. 一.服务提供者 新建Maven项

  • Go微服务项目配置文件的定义和读取示例详解

    目录 前言 场景 定义配置 配置文件 加载配置文件 实现原理 总结 项目地址 前言 我们在写应用时,基本都会用到配置文件,从各种 shell 到 nginx 等,都有自己的配置文件.虽然这没有太多难度,但是配置项一般相对比较繁杂,解析.校验也会比较麻烦.本文就给大家讲讲我们是怎么简化配置文件的定义和解析的. 场景 如果我们要写一个 Restful API 的服务,配置项大概有如下内容: Host,侦听的 IP,如果不填,默认用 0.0.0.0 Port,侦听的端口,必填,只能是数字,大于等于80

  • Vue 服务端渲染SSR示例详解

    目录 手写Vue服务端渲染 一.开始vue-ssr之旅 二.采用模板渲染 三.ssr目录创建 四.通过webpack实现编译vue项目 app.js client-entry.js server-entry.js 五.配置客户端打包和服务端打包 六.配置运行脚本 七.服务端配置 七.通过json配置createBundleRenderer方法 八.集成VueRouter 配置入口文件 配置组件信息 防止刷新页面不存在 保证异步路由加载完成 十.集成vuex配置 在后端更新vuex 在浏览器运行时

  • Node服务端实战之操作数据库示例详解

    目录 连接数据库 insert语句 简化新增sql update语句 delete语句 连接数据库 本系列是使用node作为服务器开发的操作过程记录,记录一下主要的内容并且整理过程的脉络,以初学者的方式将学习内容记录下来,从0到1逐步的学习node,教程使用过程中用到的是基于express的node框架. const mysql = require('mysql') const db = mysql.createPool({ host: 'localhost', user: 'root', pa

  • SpringCloud通过Nacos实现注册中心与远程服务调用详解流程

    目录 1. 基于Nacos实现服务注册与发现 1.1 pom依赖 1.2 yaml配置 1.3 添加启动注解 1.4 启动服务查看控制台 2.基于Nacos实现远程服务调用 2.1 客户端创建RestTemplate Bean 2.2 客户端调用代码 2.3 服务端暴露接口 2.4 服务调用测试 本文主要记录基于Nacos实现服务注册中心和远程服务调用 1. 基于Nacos实现服务注册与发现 基于pring-boot-starter-parent 2.6.8,pring-cloud-depend

  • SpringCloud注册中心部署Eureka流程详解

    目录 1.Eureka服务 2.服务提供者 3.服务消费者 4.服务调用测试 今天我们开始正式编码,如何创建spring boot项目这篇文章就不再讲述,如果想要了解可以阅读我之前的创建springboot项目. 首先我们先进行Spring cloud五大组件之一的注册中心,之前文章已经讲过注册中心的介绍,今天我们来部署Netflix的Eureka,进行单机部署以及高可用部署,并开发生产者以及消费者来进行测试eureka的注册消费.(ps:系列文章使用的Spring cloud版本为2021.0

  • java开发MVC三层架构上再加一层Manager层原理详解

    目录 MVC三层架构 MVC架构弊端 Manager层的特征 Manager层使用案例 MVC三层架构 我们在刚刚成为程序员的时候,就会被前辈们 "教育" 说系统的设计要遵循 MVC(Model-View-Controller)架构.它将整体的系统分成了 Model(模型),View(视图)和 Controller(控制器)三个层次,也就是将用户视图和业务处理隔离开,并且通过控制器连接起来,很好地实现了表现和逻辑的解耦,是一种标准的软件分层架构. MVC分层架构是架构上最简单的一种分层

随机推荐