Spring Cloud笔记03: 服务注册和服务发现的基本概念

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring Cloud笔记03: 服务注册和服务发现的基本概念相关的知识,希望对你有一定的参考价值。

参考技术A

上节在K8S集群中部署了Nacos集群,并将Nacos的Web控制台和API以Ingress (nacos.youcomany.com)的形式暴露到了k8s集群外部,便于从外部测试和访问。 这里再次强调Nacos被设计为一个在IDC内部使用的应用组件,而非面向公网环境的产品,因此需要在内部隔离网络中使用,这里为了测试将其暴露到K8S集群外部,如果是生产环境必须做好网络安全策略。

接下来我们将学习如何将服务注册到Nacos,在开始后边的实战之前,先看一下服务治理中关于服务注册和服务发现的一些概念。

服务治理首先要解决的问题就是服务注册于服务发现,解决了这两个问题才可能实现微服务之间的调用问题。

服务注册中心 : 每个服务实例会向注册中心注册自己的信息,一般包含地址、端口、协议、版本等信息。每种服务会有多个实例副本注册到注册中心,注册中心维护每种服务的多个实例列表。同时,注册中心会以某种机制去检查各个服务实例是否可用,如果某个实例已经失效会将其剔除。在某个服务实例关闭时会自动向注册中心注销自己。

常见的服务注册有三种实现方式:

服务发现 : 即服务客户端在其网络上找到其要调用服务的具体连接信息的过程。例如通过查询服务注册中心得到其所调用服务的具体 IP地址和端口。 简单的说,服务发现就是服务或者应用之间互相定位的过程。

使用服务发现后,客户端对服务的调用不再和具体的服务实例地址耦合,而是基于服务发现机制。有以下4种常见的服务发现机制:

K8S中的一个Service资源对象对应微服务。每个Service有唯一的名字,一个ClusterIP,一个端口。 K8S中的Pod资源对象中运行的容器对应服务实例,通过Pod上的标签Label和Service上定义的标签选择器Label Selector将Service与Pod关联,通过Service内建的负载均衡机制,对Service的调用将转发到Pod的容器中。 K8S中的服务注册是在Pod创建时由调度者Kubernetes完成的。K8S中的服务发现采用的是服务端负载均衡器,服务注册中心为Kubernetes(后端持久化存储etcd)。

Spring Cloud对微服务提供了完整的解决方案和统一抽象,按照微服务的功能特性: 服务治理、负载均衡、服务间调用通信、服务配置中心、服务网关、分布式链路追踪、消息总线、消息时间驱动、分布式事务等,提供了一系列组件,被称为Spring Cloud全家桶。 全家桶中的功能组件还支持使用第三方实现的某个组件单独替换,只要第三方组件是遵循Spring Cloud Common的抽象实现的。

Spring Cloud在服务治理的组件上有以下三种选择:

当然由于"某些原因",在最新版本的Spring Cloud中Netflix组件库已经逐渐被移除。

我们在这里对Spring Cloud服务注册和服务发现的学习将使用Spring Cloud Alibaba组件的Nacos。

Nacos是Spring Cloud Alibaba提供的服务发现和配置管理的解决方案。Nacos是用Java开发的,通过Spring Cloud Alibaba可以很好的与Spring Cloud整合。 如果项目的所有微服务都是用Java开发的,那么使用Nacos作为服务发现可能会使一个不错的选择。

Nacos的服务注册采用的是由"服务进程内直接包含服务注册模块,由服务实例自己完成上线注册和下线注销。",这与K8S服务注册方案中"由一个中间调度者K8S来帮助处理服务注册"是不同的。

Spring Cloud学习笔记-004

  • 高可用注册中心

  在微服务架构这样的分布式环境中,需要充分考虑发生故障的情况,所以在生产环境中必须对各个组件进行高可用部署,对于微服务如此,对于服务注册中心也一样。如果一直使用单节点的服务注册中心,这在生产环境中显然并不合适,需要构建高可用的服务注册中心以增强系统的可用性。

  在Eureka的服务治理设计中,所有节点即是服务提供方,也是服务消费方,服务注册中心也不例外。Eureka Server的高可用实际上就是将自己作为服务向其他服务注册中心注册自己,这样就可以刑场一组互相注册的服务中心,以实现服务清单的互相同步,达到高可用的效果。

1. 新建maven工程,骨架选择quickstart,工程名称:demo-eureka-ha

2. 加入相关依赖:

技术分享图片

3. 在src\\main\\resources目录下新建application-peer1.yml文件,作为peer1服务中心的配置,并将serviceUrl指向peer2:

技术分享图片

4. 在src\\main\\resources目录下新建application-peer2.yml文件,作为peer2服务中心的配置,并将serviceUrl指向peer1:

技术分享图片

5. 修改系统hosts文件,添加对peer1和peer2的转换:

技术分享图片

6. 在src\\main\\resources目录下新建application.yml文件:

技术分享图片

7. 编写启动类:

技术分享图片

8. 启动项目,启动第一个项目的时候,会报错,可暂时忽略,是因为它没有找到peer2这个注册中心,启动完毕后,将application.yml文件里的环境改为peer2,再次启动项目(注:不要关闭第一个启动的项目),浏览器分别访问两个项目:

技术分享图片

9. 相应的,服务提供者也需要修改一下配置,修改demo-member工程的配置文件,将两个注册中心都配置进去:

技术分享图片

10. 启动demo-member项目,访问注册中心,发现两个注册中心都注册了会员服务。

以上是关于Spring Cloud笔记03: 服务注册和服务发现的基本概念的主要内容,如果未能解决你的问题,请参考以下文章

Spring Cloud学习笔记-003

spring Cloud(初级版)笔记(最新最详细)周阳老师2021年6月更新

Spring Cloud服务的注册与发现

springcloud学习03-spring cloud eureka

笔记:Spring Cloud Zuul 快速入门

springcloud学习03-spring cloud eureka(下)