SpringCloud 整合 Eureka 实现服务注册中心

转载声明 : 该文章出处为 扛麻袋的少年


写在开头

  接上一篇文章:基于 RestTemplate 搭建微服务工程。进行了简单的微服务工程搭建。或许你也会有疑问。既然 RestTemplate 就可以搞微服务了,为什么还要用那么多的 Eureka、Ribbon、Spring Cloud Alibaba 等一套体系呢?这不是画蛇添足吗?

  Eureka 在2.0 版本已经停更,本文只是简单介绍它的使用。替代 Eureka 的 Spring Cloud Alibaba Nacos ,后续也会有介绍,请继续往下看

1.为什么要使用Spring Cloud 全家桶

  上面说的倒是也在理。不知道你有用过 Dubbo + Zipkin 实现全链路的追踪。那为什么要用 Zipkin 呢?就是用来解决 Dubbo 多个模块之间彼此调用的 服务管理理 !!! 服务管理!!!

  基于 RestTemplate 搭建微服务工程 虽然可以实现服务之间的调用,但是 随着服务模块的增加服务模块需要变更为集群模式 的需求,这时候 服务与服务之间的管理(链路调用管理、配置管理、注册管理 等等) 就变得非常的困难。此时就需要用到 Spring Cloud 全家桶来对我们多个服务进行管理了。
在这里插入图片描述

2.服务治理

  基于 RestTemplate 搭建微服务工程,在我们没有服务注册中心时,也可以实现多个服务之间调用。服务调用之间,我们是通过 RestTemplate 直接将 服务提供者 URL写死在代码中的方式来完成调用。

  当服务很多时,单靠代码来手动管理就变得很麻烦。此时就需要引入一个公共组件来帮我们统一管理这么多的服务,包括 服务是否正常运行集群服务管理动态感知服务上下线 等。Eureka 就这样来到了我们的身边。

2.1 什么是服务治理

  Spring Cloud 封装了 Netflix 公司开发的 Eureka 模块来 实现服务治理

  在传统的 RPC 远程调用框架中,管理每个服务与服务之间的依赖关系非常复杂,所以需要使用 服务治理 来管理服务与服务之间的依赖关系,从而实现 服务调用负载均衡容错服务的注册与发现 等。

2.2 什么是服务注册与发现

  Eureka 采用了 CS 的设计机构 (C指的是client(客户端软件),S指的是Server(服务端软件),Eureka Server 作为服务注册功能的服务器,它是服务注册中心。而系统中的其他微服务,使用 Eureka 的客户端连接到 Eureka Server,并维持心跳连接。这样系统的维护人员就可以通过 Eureka Server 来监听系统中各个微服务是否正常运行。

  在服务注册与发现中,有一个注册中心。当服务器启动的时候,会把当前自己服务器的信息(服务地址、通讯地址等)以别名的方式注册到注册中心上。另一方(消费者|服务提供者)会以该别名的方式去注册中心上获取到实际的服务通讯地址,然后再通过本地RPC调用、远程RPC调用等方式来实现通信。
在这里插入图片描述
  Eureka 的思想,同 Dubbo 类似。有时间的话,你可以通过链接来看看 Dubbo 的架构,链接:什么是Dubbo-Dubbo架构,基本上是如出一辙。只不过 Dubbo 推荐的注册中心是 ZooKeeper 罢了

3.Eureka 组件介绍

Eureka 包含两个组件:1.Eureka Server   2.Eureka Client

3.1 Eureka Server

  Eureka Server 提供 服务注册 服务。各个微服务节点通过配置启动后,会在 Eureka Server 中进行注册,这样 Eureka Server 中的服务注册表中就会存储所有可用服务节点的信息,服务节点的信息可以在界面中直观的看到。

3.2 Eureka Client

  Eureka Client 通过 注册中心 进行访问。它是一个 Java 客户端,用于简化与 Eureka Server 的交互,客户端同时也具备一个内置的、使用轮询(round-robin)负载算法的负载均衡器。

  在应用启动后,Eureka Client 将会向 Eureka Server 发送心跳连接(周期为30s)。如果 Eureka Server 在多个心跳周期内没有接收到某个节点的心跳,Eureka Server 将 会从服务注册表中把这个服务节点移除(默认 90s)

4.微服务工程引入 Eureka

4.1 搭建 Eureka Server 工程

Ⅰ.创建 Eureka Server 模块

  模块名称定义为:cloud_eureka_server_7001,来充当服务注册中心的角色。

Ⅱ.引入 pom.xml 依赖

  Spring Boot 项目需要导入的 pom 依赖,此处不作介绍。本文项目代码请跳转连接获取:Eureka集群加入微服务工程 (提取码:h5al)

<!--父pom.xml就是一些基础依赖,请下载工程代码查看-->
<!-- 加入eureka-server依赖 -->
<dependency>
	<groupId>org.springframework.cloud</groupId>
	<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>

 
  
  
Ⅲ.application.yml 配置文件修改

新增 eureka 相关配置

eureka:
  instance:
     hostname: localhost  #eureka服务端的实例名字
  client:
     #false表示不向注册中心注册自己
     register-with-eureka: false
     #false表示自己就是注册中心,职责是维护服务实例,并不需要去检索服务
     fetch-registry: false
     service-url:
         #设置与eureka server交互的地址查询服务和注册服务都需要依赖这个地址
         defaultZone: http://${
    
    eureka.instance.hostname}:${
    
    server.port}/eureka/

 
  
  
Ⅳ.启动类添加 @EnableEurekaServer 注解
@EnableEurekaServer //说明7001是Eureka是服务注册中心
@SpringBootApplication
public class EurekaMain7001 {
    
    
    public static void main(String[] args) {
    
    
        SpringApplication.run(EurekaMain7001.class,args);
    }
}

 
  
  
Ⅴ.Eureka Server 基本配置完成

通过地址:http://localhost:7001 访问,如图所示
在这里插入图片描述

4.2 改造 Eureka Client 工程

  Eureka Server 服务已经成功,接下来我们只需将 服务提供者服务消费者 都注册到 Eureka Server 中,让 Eureka Server 能够管理这些服务。

  服务提供者服务消费者 相对Eureka Server 来说,他们都是客户端,改造都是一样样的。此处就以 服务提供者 为例进行改造。

Ⅰ.引入 pom.xml 依赖
<!--父pom.xml就是一些基础依赖,请下载工程代码查看-->
<!-- 引入eureka-client依赖 -->
<dependency>
	<groupId>org.springframework.cloud</groupId>
	<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>

 
  
  
Ⅱ.application.yml 配置文件修改

新增 eureka client 相关配置

eureka:
  client:
    # 表示是否将自己注册进 EurekaServer.默认为true
    register-with-eureka: true
    # 是否从EurekaServer抓取已有的注册信息,默认为true.单节点无所谓,集群必须设置为true,才能配合ribbon使用负载均衡
    fetchRegistry: true
    service-url:
      #EurekaServer地址
      defaultZone: http://localhost:7001/eureka     #单机版

 
  
  
Ⅲ.启动类添加 @EnableEurekaClient 注解
@SpringBootApplication
@EnableEurekaClient //说明8001是Eureka 客户端
public class PaymentMain8001 {
    
    
    public static void main(String[] args) {
    
    
        SpringApplication.run(PaymentMain8001.class, args);
    }
}

 
  
  
Ⅳ.服务消费者也进行相同配置。通过地址:http://localhost:7001访问

我们可以看到,服务提供者 和 服务消费者,都已经成功注册到 Eureka Server 中,服务注册成功。
在这里插入图片描述

Ⅴ.缺点

已经将服务模块,都注册到了 Eureka Server 中。现在就得保证服务的高可用了

  1. 只有一台 Eureka Server 来提供服务,如果 Eureka Server 宕机的话,所有服务都完蛋;
  2. 只有一台 服务提供者 ,它如果挂了,Eureka Server 不挂,同样得完蛋。

高可用集群版 Eureka 志在必得。

5.集群版搭建

  通过 2.2 介绍,Eureka 架构图标明 Eureka ServerService Provider 都是支持集群模式的。为了保证服务的高可用,接下来我们就将 单机版 改造为 集群模式。在改造之前我们先来了解一下 Eureka 集群的原理。

5.0.1 Eureka Server 集群原理

一句话:相互注册,相互守望

  比如有两个 Eureka Server 7001Eureka Server 7002,就是 7001 将自己注册到 7002,同时 7002 将自己注册到 7001 的过程。

  如果有三个 Eureka Server 的话,就是 7001 将自己同时注册到 7002、7003,其他两个节点也一样,相互注册。

5.0.2 集群模拟准备工作

  Tips:当前集群版环境的搭建,是在一台机器上完成的,仅用来作演示学习。实际开发中,并不会是这样子复杂的。本例仅用作演示学习使用。

  由于是在一台机器上模拟 Eureka Server 集群的相互注册,此处需要在 C:\Windows\System32\drivers\etc\hosts 文件下配置一下 IP 和 域名 映射关系,让机器认为是它们是不同机器。

# 在hosts下配置映射关系
127.0.0.1 eureka7001.com
127.0.0.1 eureka7002.com

 
  
  

5.1 Eureka Server 集群搭建

!!!切记:实际开发中并不会代码这么重复的搞,此处只是模拟一下哈。

Ⅰ.再创建 Eureka Server 模块

  模块名称定义为:cloud_eureka_server_7002,来充当服务注册中心的角色。让它与 cloud_eureka_server_7001 构成集群模式。

Ⅱ.application.yml 配置文件修改

  除 application.yml 配置外,其他配置都同 cloud_eureka_server_7001 配置一模一样。此处我们来修改 application.yml 配置文件。

########################################
# cloud_eureka_server_7001 配置文件修改  #
########################################
server:
  port: 7001
eureka:
  instance:
    #hostname: localhost
    hostname: eureka7001.com  #eureka服务端的实例名字(集群版)
  client:
    register-with-eureka: false
    fetch-registry: false
    service-url:
      #defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/    #单机版
      defaultZone: http://eureka7002.com:7002/eureka/    #集群版(相互注册)

 
  
  
########################################
# cloud_eureka_server_7002 配置文件修改  #
########################################
server:
  port: 7002
eureka:
  instance:
    #hostname: localhost
    hostname: eureka7002.com  #eureka服务端的实例名字(集群版)
  client:
    register-with-eureka: false
    fetch-registry: false
    service-url:
      #defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/    #单机版
      defaultZone: http://eureka7001.com:7001/eureka/    #集群版(相互注册)

 
  
  
Ⅲ.配置完成启动7001、7002,通过地址:http://localhost:7001(或7002)访问

在这里插入图片描述

5.2 服务提供者(Service Provider) 集群搭建

  原有服务提供者为 cloud-provider-payment8001 ,我们在来个一样的模块,命名为:cloud-provider-payment8002。让它们两个构成集群模式。

Ⅰ.application.yml 配置文件修改

  除 application.yml 配置外,其他配置都同 cloud-provider-payment8001 配置一模一样。此处我们来修改 application.yml 配置文件。

##########################################
# cloud-provider-payment8001 配置文件修改  #
##########################################
# 服务端口
server:
  port: 8001
eureka:
  client:
    register-with-eureka: true
    fetchRegistry: true
    service-url:
      #EurekaServer地址(将服务注册到Eureka Server 集群)
      defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka     #集群版

 
  
  
##########################################
# cloud-provider-payment8002 配置文件修改  #
##########################################
# 服务端口
server:
  port: 8002
eureka:
  client:
    register-with-eureka: true
    fetchRegistry: true
    service-url:
      #EurekaServer地址(将服务注册到Eureka Server 集群)
      defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka     #集群版

 
  
  
Ⅱ.配置完成启动7001、7002,通过地址:http://localhost:7001(或7002)访问

此时发现:

  1. 7001 和 7002 两个Eureka Server 集群之间相互注册。
  2. 8001 和 8002 两个服务提供方也注册到了 7001 和 7002 两个 Eureka Server 集群中
    在这里插入图片描述

6.将消费者注册到 Eureka Server集群

Ⅰ.只需要对 application.yml 配置文件改造即可

eureka:
  client:
    register-with-eureka: true
    fetchRegistry: true
    service-url:
      #EurekaServer地址(将消费者注册到Eureka Server 集群即可)
      defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka     #集群版

 
  
  

Ⅱ.消费者成功注册到 Eureka Server 集群

在这里插入图片描述

7.微服务调试

Ⅰ.需要对消费者 Controller 进行修改

  之前我们是直接将地址写死的状态,因为现在 服务提供方 也已经是集群模式了,我们不能继续使用域名来直接调用了,此处就需要来使用 服务名调用了

@RestController
@Slf4j
public class OrderController {
    
    
	//public static final String PAYMENT_URL = "http://localhost:8001";
	// 修改为服务名访问
    public static final String PAYMENT_URL = "http://CLOUD-PAYMENT-SERVICE";
    @Resource
    private RestTemplate restTemplate;
    @GetMapping("/consumer/payment/create")
    public CommonResult<Payment> create(Payment payment) {
    
    
        return restTemplate.postForObject(PAYMENT_URL + "/payment/create", payment, CommonResult.class);
    }
    @GetMapping("/consumer/payment/get/{id}")
    public CommonResult<Payment> getPayment(@PathVariable("id") Long id) {
    
    
        return restTemplate.getForObject(PAYMENT_URL + "/payment/get/" + id, CommonResult.class);
    }
}

 
  
  

Ⅱ.RestTemplate 开启负载均衡注解

@Configuration
public class ApplicationContextConfig {
    
    
    /**
     * RestTemplate配置(HttpClient的封装类)
     * @return
     */
    @Bean
    @LoadBalanced //RestTemplate 使用@LoadBalanced 开启负载均衡注解,负载均衡默认为轮询,也可以俺需要进行修改
    public RestTemplate getRestTemplate() {
    
    
        return new RestTemplate();
    }
}

 
  
  

Ⅲ.Eureka微服务集群模式,大功告成

  到此为止,Eureka Server 集群Service Provider 集群消费者注册到 Eureka Server 集群(包括 Service Provider 集群注册到 Eureka Server 集群)全部配置完成。

  RestTemplate 配合 微服务名 访问方式、@LoadBalance 默认轮询负载均衡机制的使用,Eureka 微服务集群模式,大功搞成。
在这里插入图片描述

本文代码下载地址:SpringCloud 整合 Eureka 实现服务注册中心 (提取码:h5al)
 
下一篇:SpringCloud 整合 Zookeeper 实现服务注册中心

猜你喜欢

转载自blog.csdn.net/m0_37989980/article/details/108440271