个人主页:叶落闲庭
我的专栏:
c语言
数据结构
javaEE
操作系统
Redis

石可破也,而不可夺坚;丹可磨也,而不可夺赤。


eureka

  • 一、Eureka原理分析
    • 1.1 服务调用出现的问题
    • 1.2 Eureka的作用
  • 二、 搭建Eureka
    • 2.1 创建项目
    • 2.2 编写启动类,添加@EnableEurekaServer注解
    • 2.3 添加application.yml的配置文件
    • 2.4 注册服务到Eureka
      • 2.4.1 在服务项目中引入eureka客户端依赖
      • 2.4.2 配置application.yml文件的信息
      • 2.4.3 模拟多实例部署
    • 2.5 服务发现
      • 2.5.1 在order-service完成服务拉取
      • 2.5.2 在order-service顶目的启动类Orderapplication中的RestTemplate添加负载均衡注解

一、Eureka原理分析

1.1 服务调用出现的问题

当有两个服务,第一个服务需要远程调用第二个服务,采用的方式是发起一次HTTP请求,在之前的代码中是将服务提供者的ip和端口号硬编码到服务发起者中,采用这种方式会出现一些问题,在开发时,会有开发环境、测试环境、生产环境等,每次环境的变更可能会使服务的地址发生改变,采用硬编码就需要在环境发生变化时修改硬编码,然后重新编译打包,这样会很麻烦,同时,为了处理并发等问题,服务提供者可能会是一个集群,集群中每个服务提供者都有自己的地址,这样由于服务消费者的硬编码,将无法准确的得到想要的服务。

1.2 Eureka的作用

  • 服务消费者该如何获取服务提供者的地址信息?
  • 如果有多个服务提供者,消费者该如何选择?
  • 消费者如何得知服务提供者的健康状态?

eureka中有一个eureka-server(注册中心)和作为eureka-client(eureka客户端)的服务消费者和服务提供者,其中服务提供者在启动时会把自己的信息注册给eureka-server,每一个服务启动时都会进行注册操作,此时,若有服务消费者想要获取一个服务,就可以从eureka注册中心中找,服务消费者将自己需要的服务发给注册中心,注册中心就会返回对应的服务信息,但服务提供者可能是一个集群,那么注册中心返回的结果可能是多个,这时可以采用负载均衡的算法挑出一个,然后发起远程调用的请求。
每个服务每隔30s都会向eureka-server(注册中心)发送一次心跳,表示当前服务正常运行,当eureka-server(注册中心)超过规定时间没有收到一个服务的心跳,会自动将这个服务移除,说明这个服务运行出现了问题。

二、 搭建Eureka

2.1 创建项目

在现有项目中创建名为eureka-server(可以自定义名称)的子模块



  • 选择Maven:


  • 在pom.xml中添加Eureka的依赖,添加SpringBoot的启动依赖
<dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-server</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency></dependencies>

2.2 编写启动类,添加@EnableEurekaServer注解

@EnableEurekaServer@SpringBootApplicationpublic class EurekaApplication {public static void main(String[] args) {SpringApplication.run(EurekaApplication.class,args);}}

2.3 添加application.yml的配置文件

server:port: 10086spring:application:name: eurekaserver# eureka服务名称eureka:client:service-url:# eureka地址信息defaultZone: http://localhost:10086/eureka

2.4 注册服务到Eureka

  • 将一个服务注册到EurekaServer步骤如下:

2.4.1 在服务项目中引入eureka客户端依赖

<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId></dependency>

2.4.2 配置application.yml文件的信息

spring:datasource:url: jdbc:mysql://localhost:3306/cloud_user" />username: rootpassword: 123456driver-class-name: com.mysql.jdbc.Driverapplication:name: userservice # user服务的服务名称
eureka:client:service-url: #eureka地址信息defaultZone: http://localhost:10086/eureka

2.4.3 模拟多实例部署

  • 在idea中选择一个部署好Eureka的模块,右键选择Copy Configuration

  • 自定义一个名字:

  • 配置与原模块不同的端口号,点击Environment,在VM options中修改端口-Dserver.port=新端口号


2.5 服务发现

2.5.1 在order-service完成服务拉取

  • 服务拉取是基于服务名称获取服务列表,然后在对服务列表做负载均衡
  • 修改OrderService的代码,修改访问的url路径,用服务名代替ip、端口:
//2.利用RestTemplate发起http请求,查询用户String url = "http://userservice/user/" + order.getUserId();

2.5.2 在order-service顶目的启动类Orderapplication中的RestTemplate添加负载均衡注解

@Bean@LoadBalancedpublic RestTemplate restTemplate() {return new RestTemplate();}