Spring Cloud微服务学习笔记之服务治理 Eureka

mac2022-06-30  85

服务治理Eureka

一、Spring Cloud Eureka的使用1.1 Eureka Server的使用1.2 Eureka Client的使用1.3 Eureka的高可用 二、Eureka在分布式中的地位与原理2.1 服务发现的两种方式2.2 服务实现语言的两种方式

一、Spring Cloud Eureka的使用

服务治理组件Spring Cloud Eureka是微服务架构最基础的模块。为什么要有服务治理组件?在服务数量较少时,我们可以通过静态配置来完成服务间的相互调用。随着系统越来越复杂,服务数量越来越多,且可能数量在不断频繁变化,手工维护的静态配置将越来越难,需要一个组件来完成自动化的服务注册与发现功能。Eureka由Eureka Server与Eureka Client两个组件组成。

1.1 Eureka Server的使用

首先,在IDEA中通过Spring Initializr选择Spring Cloud Discovery 中的Eureka Server组件(将自动在pom.xml添加Eureka Server相关的依赖),创建一个Spring Boot项目添加pom依赖(之后项目都要添加)

<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> 直接运行该程序,启动后在浏览器访问localhost:1111,结果如图所示

在原程序上只添加一个Eureka Server的注解,运行程序访问localhost:1111结果如图 @SpringBootApplication @EnableEurekaServer public class EurekaApplication { public static void main(String[] args) { SpringApplication.run(EurekaApplication.class, args); } }

在application.yml中修改相应的配置 server: port: 1111 eureka: client: fetch-registry: false register-with-eureka: false service-url: defaultZone: http://localhost:1111/eureka/ server: enable-self-preservation: false spring: application: name: eureka

server.port 用来指定该服务运行时所占用的端口号(内置Tomcat容器运行时的端口号)

eureka.client.register-with-eureka 用来指定注册中心是否注册自己的微务

神坑:server.port与eureka.client.register-with-eureka端口号一定要相同,否则自身是无法注册在注册中心的,其他client也无法注册

eureka.client.fetch-registry 用来指定是否需要检索服务,即服务发现

eureka.client.service-url 用来指定注册中心的地址,其他服务注册时要注册在这个地址上

eureka.server.enable-self-preservation 用来指定注册中心的健康检查机制,开发状态下默认是宁可信其有不可信其无的模式,与生产环境保持一致则设为false

spring.application.name 用来指定该服务的名称

1.2 Eureka Client的使用

同server,在IDEA中通过Spring Initializr选择Spring Cloud Discovery 中的Eureka Discovery Client 组件,创建一个Spring Boot项目

在原程序上添加一个@EnableEurekaClient的注解

@EnableDiscoveryClient与@EnableEurekaClient区别: 如果选用的注册中心是eureka,那么就推荐@EnableEurekaClient, 如果选用其他的注册中心,那么推荐使用@EnableDiscoveryClient, 源码中@EnableEurekaClient注解包含@EnableDiscoveryClient注解。

在application.yml中修改相应的配置 eureka: client: service-url: defaultZone: http://localhost:1111/eureka/ instance: hostname: ClientName spring: application: name: client

eureka.instance.hostname 用来指定该服务实例后来访问时的域名,即替代下图红框中的内容

在已启动注册中心的情况下,运行Client 程序,然后访问localhost:1111结果如图

可见client端已注册在注册中心上

1.3 Eureka的高可用

为什么要Eureka高可用? 所有的服务都注册在注册中心上,若注册中心宕机,整个微服务框架将不可用,那么此时服务拆分与单体架构并无区别,不能达到高可用的目的。

在原有项目的基础上,注释掉server.port=1111的配置,在启动配置中复制一份服务,并在启动配置中配置server.port

EurekaApplication1服务运行端口为1112,注册在EurekaApplication2的地址http://localhost:1111/eureka/上;

EurekaApplication2服务运行端口为1111,注册在EurekaApplication1的地址http://localhost:1112/eureka/上;

Eureka Client 服务不变(注册在EurekaApplication1上),此时运行两个Eureka server服务,访问localhost:1111即EurekaApplication2服务,发现Eureka Client 服务也注册在了EurekaApplication2上。

若此时EurekaApplication1宕机,client 仍注册在EurekaApplication2上,保障了Eureka Server的高可用;但如若此时又将client 重启,将无法注册在EurekaApplication2上,所以应该将client 在EurekaApplication1、EurekaApplication2都要注册,即defaultZone= http://localhost:1111/eureka/, http://localhost:1112/eureka/。逻辑图如下:

4. 3个Eureka Server的高可用逻辑图如图

二、Eureka在分布式中的地位与原理

2.1 服务发现的两种方式

客户端发现

Eureka Client就是这种方式,Client(A) 在 Eureka Server上获取要消费的多个服务实例(B1、B2、B3…)并缓存在本地,通过负载均衡算法(轮询、随机、哈希等)选择一个实例去消费。该方式简单直接,但需要每个Client实现一套选择机制。Spring Cloud全系列实现方式。

服务端发现(代理)

Eureka Server与要消费的多个服务实例(B1、B2、B3…)对Client(A)透明不可见,A只需访问代理,由代理选择一个B供消费。Ngnix、Zookeeper、K8S都可以作为服务发现的负载均衡器。阿里系实现方式。

Ngnix不仅可以作为HTTP反向代理服务器也可以做服务发现的负载均衡器

2.2 服务实现语言的两种方式

相同语言(Java)

Eureka Server与Eureka Client 均是由Java实现的。Spring Cloud全系列框架主要适于Java实现的分布式系统,或者与JVM兼容的语言构建的系统。如若其他语言想应用Eureka,需自己实现客户端,如.NET的Steeltoe、Node.js的eureka-js-client。服务间调用方式为Restful。

不同语言

不同语言是微服务的特点之一即异构(不同语言、不同数据库),此时最好使用阿里系的dubbo,效率会更高。服务间调用方式为RPC。

最新回复(0)