持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第4天
Eureka
前言
由于是系列文章所以知识是连贯的,当然代码也是,所以大家要是有看不懂的可以往上走一篇
Eureka
提供者和消费者
服务提供者 : 一次业务中,被其它微服务调用的服务。(提供接口给其它微服务) 服务消费者 : 一次业务中,调用其它微服务的服务。(调用其它微服务提供的接口)
一个服务既可以是消费者也可以是提供者
Eureka注册中心
远程服务调用问题
服务有很多,端口不一,环境(使用环境,测试环境等)各不相同,服务的存活不一
- 服务消费者该如何获取服务提供者的地址信息?
- 如果有多个服务提供者,消费者该如何选择?
- 消费者如何得知服务提供者的健康状态?
Eureka的作用
将服务的消费者和提供者统一为eureka-client(客户端) 其中服务提供者(注册自己的信息到eureka-server,每隔30s向eureka-server发送心跳) 服务消费者(根据服务名称从eureka-server拉取服务列表,基于服务列表做负载均衡,选中一个微服务后发起远程调用) 而eureka-server作为注册中心(记录服务信息,服务心跳监控)
当每一个服务启动时会将自己的信息注册给eureka-server形成注册表 当服务的消费者需要服务时会向eureka-server进行索取,从中拉取服务的信息 当服务的消费者拿到多个服务要确认在哪个服务上进行时需要用到负载均衡,向服务的提供者发送请求(远程调用) 服务的提供者每30s向eureka-server发送一次心跳请求来确保服务存活,若服务不再发送则认为服务死亡,将死亡的服务从注册表中剔除
- 消费者该如何获取服务提供者具体信息?
- 服务提供者启动时向eureka注册自己的信息eureka保存这些信息
- 消费者根据服务名称向eureka拉取提供者信息
- 如果有多个服务提供者,消费者该如何选择?
- 服务消费者利用负载均衡算法,从服务列表中挑选一个
- 消费者如何感知服务提供者健康状态?
- 服务提供者会每隔30秒向EurekaServer发送心跳请求,报告健康状态
- eureka会更新记录服务列表信息,心跳不正常会被剔除
- 消费者就可以拉取到最新的信息
quickstart
新建项目导入eureka-server 处理pom请看上一篇文章,这里我就不说了pom处理
1.创建项目选择eureka server
同时我给出pom依赖
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.example</groupId>
<artifactId>springcloud</artifactId>
<version>0.0.1-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>
<groupId>com.example</groupId>
<artifactId>eureka-server</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>eureka-server</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<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-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
复制代码
2.编写启动类,使用@EnableEurekaServer
package com.example.eurekaserver;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
@EnableEurekaServer
@SpringBootApplication
public class EurekaServerApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaServerApplication.class, args);
}
}
复制代码
3.配置yaml
server:
port: 8889
spring:
application:
name: eurekaserver
eureka:
client:
service-url:
defaultZone: http://127.0.0.1:8889/eureka
复制代码
启动访问后你看到这些东西就说明没问题
Eureka服务注册
接下来我们要进行服务的注册
1.到commons模块下引入client依赖
<!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-netflix-eureka-client -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
<version>3.1.2</version>
</dependency>
复制代码
2.添加yaml配置
eureka:
client:
service-url:
defaultZone: http://127.0.0.1:8889/eureka
复制代码
完整
server:
port: 8888
spring:
application:
name: commons
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/routerboot?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai&zeroDateTimeBehavior=CONVERT_TO_NULL&allowPublicKeyRetrieval=true
username: root
password: syf20020816
eureka:
client:
service-url:
defaultZone: http://127.0.0.1:8889/eureka
复制代码
3.测试
打开服务进行测试
Eureka服务拉取
服务拉取是基于服务名称获取服务列表,然后在对服务列表做负载均衡
1.根据上面的服务注册把client也注册进去
2.改写服务地址为服务名
原来
private static final String COMMONS_URL = "http://localhost:8888";
复制代码
改写后
private static final String COMMONS_URL = "http://commons";
复制代码
3.添加@LoadBalanced进行负载均衡
找到我们的RestTemplate 注册的Bean进行添加
package com.example.client.config;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;
@Configuration
public class ApplicationContextConfig {
@Bean
@LoadBalanced
public RestTemplate getRestTemplate(){
return new RestTemplate();
}
}
复制代码
测试后正常,但是这里是没有负载均衡的,因为我没开启
模拟负载均衡
1.找到我们要进行做负载的服务
复制配置
修改名称和环境中的虚拟机选项
-Dserver.port=8887
复制代码
那么下面就多出一个服务了
启动即可
我们就可以看到多出服务了
2.再次启动测试
如果大家要看日志打印可以加上@Slf4j注解(这个应该不用说了吧) 我这边访问了4次奈何三次都走了8887端口一次走了8888
但是确实已经达到负载均衡