服务注册与发现,主要是使用Spring Cloud Eureka。
本文主要对如何搭建Eureka注册中心,搭建Eureka客户端,搭建Eureka集群及给Eureka注册中心添加登录认证进行介绍。
搭建Eureka注册中心
通过idea创建一个SpringCloud项目
<?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>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.4.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.ucucs.cloud</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>11</java.version>
<spring-cloud.version>Hoxton.SR8</spring-cloud.version>
<java.compile.version>1.8</java.compile.version>
<maven.compiler.source>${java.compile.version}</maven.compiler.source>
<maven.compiler.target>${java.compile.version}</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
</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-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-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>
<configuration>
<layers>
<enabled>true</enabled>
</layers>
</configuration>
</plugin>
</plugins>
</build>
</project>
其中maven plugin主要应用了最新的分层技术,用于Docker分层打包。
要启用注册中心,需要添加相关注解。
// 启用注册中心功能
@EnableEurekaServer
@SpringBootApplication
public class EurekaServerApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaServerApplication.class, args);
}
}
Eureka注册中心,需要配置相关Host和服务注册地址,以及服务心跳判断规则。
eureka:
instance:
hostname: localhost # 指定主机地址
lease-renewal-interval-in-seconds: 5 # 心跳间隔,5秒
lease-expiration-duration-in-seconds: 10 # 没有心跳的淘汰时间,10秒
instance-id: ${spring.application.name}:${spring.cloud.client.ipAddress:${eureka.instance.hostname:}}:${spring.application.instance_id:${server.port}} # 实例id
client:
fetch-registry: false # 指定是否要从注册中心获取服务(注册中心不需要开启)
register-with-eureka: false # 指定是否要注册到注册中心(注册中心不需要开启)
service-url:
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/ # 注册中心地址
server:
enable-self-preservation: true # 关闭保护模式,测试环境可以false,生产为true
eviction-interval-timer-in-ms: 5000 # 主动失效检测间隔,配置成5秒
use-read-only-response-cache: false # 关闭输出注册缓存
renewal-threshold-update-interval-ms: 120000 # 心跳阈值计算周期
renewal-percent-threshold: 0.85 # 指定每分钟需要收到的续约次数的阈值,防止网络抖动误判
#
# 客户端配置优化
# 心跳间隔,5秒
# eureka.instance.leaseRenewalIntervalInSeconds=5
# 没有心跳的淘汰时间,10秒
# eureka.instance.leaseExpirationDurationInSeconds=10
# 定时刷新本地缓存时间
# eureka.client.registryFetchIntervalSeconds=5
# ribbon缓存时间
# ribbon.ServerListRefreshInterval=2000
#
# 正常上线下线客户端最大感知时间
# eureka.client.registryFetchIntervalSeconds+ribbon.ServerListRefreshInterval = 7秒
#
# 异常下线客户端最大感知时间
# 2*eureka.instance.leaseExpirationDurationInSeconds+
# eureka.server.evictionIntervalTimerInMs+
# eureka.client.registryFetchIntervalSeconds+
# ribbon.ServerListRefreshInterval = 32
以上配置已经经过优化,可直接用于生产环境。
注册中心与Docker
如果使用Docker,需要将相关参数变成从环境变量里获取
eureka:
instance:
hostname: ${EUREKA_HOST:localhost} # 指定主机地址
client:
service-url:
defaultZone: ${EUREKA_ZONE_URL:http://${eureka.instance.hostname}:${server.port}/eureka/} # 注册中心地址
fetch-registry: true # 指定是否要从注册中心获取服务(注册中心不需要开启)
register-with-eureka: true # 指定是否要注册到注册中心(注册中心不需要开启)
${环境变量:默认值}
建立Dockerfile,主要是应用Springboot分层技术
# 指定基础镜像,这是分阶段构建的前期阶段
FROM openjdk:8-jre-alpine as builder
# 执行工作目录
WORKDIR application
# 配置参数
ARG JAR_FILE=target/*.jar
# 将编译构建得到的jar文件复制到镜像空间中
COPY ${JAR_FILE} application.jar
# 通过工具spring-boot-jarmode-layertools从application.jar中提取拆分后的构建结果
RUN java -Djarmode=layertools -jar application.jar extract
# 正式构建镜像
FROM openjdk:8-jre-alpine
WORKDIR application
# 前一阶段从jar中提取除了多个文件,这里分别执行COPY命令复制到镜像空间中,每次COPY都是一个layer
COPY --from=builder application/dependencies/ ./
COPY --from=builder application/spring-boot-loader/ ./
COPY --from=builder application/snapshot-dependencies/ ./
COPY --from=builder application/application/ ./
ENTRYPOINT ["java", "org.springframework.boot.loader.JarLauncher"]
建立Docker Compose文件
version: "3.8" # 指定 docker-compose.yml 文件的写法格式
services: # 用来表示compose需要启动的服务 本文件从.env文件读取变量
# 服务间通信,是通过服务名,不是通过容器名
# 服务间端口,是内部端口,非外部映射端口
eurekaNodeA: # 服务名
container_name: eureka_node_a # 容器名
image: eureka-server:latest
environment:
- TZ=Asia/Shanghai
- EUREKA_HOST=eurekaNodeA
- EUREKA_ZONE_URL=http://eurekaNodeB:8080/eureka/,http://eurekaNodeC:8080/eureka/
- spring.profiles.active=cluster
- SERVER_PORT=8080
- JAVA_OPTS=-XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=128m -Xms1024m -Xmx1024m -Xmn256m -Xss256k -XX:SurvivorRatio=8 -XX:+UseConcMarkSweepGC -XX:+PrintGCDetails
networks:
- eureka-net
ports:
- "8081:8080"
eurekaNodeB:
container_name: eureka_node_b
image: eureka-server:latest
environment:
- TZ=Asia/Shanghai
- EUREKA_HOST=eurekaNodeB
- EUREKA_ZONE_URL=http://eurekaNodeA:8080/eureka/,http://eurekaNodeC:8080/eureka/
- spring.profiles.active=cluster
- SERVER_PORT=8080
- JAVA_OPTS=-XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=128m -Xms1024m -Xmx1024m -Xmn256m -Xss256k -XX:SurvivorRatio=8 -XX:+UseConcMarkSweepGC -XX:+PrintGCDetails
networks:
- eureka-net
ports:
- "8082:8080"
eurekaNodeC:
container_name: eureka_node_c
image: eureka-server:latest
environment:
- TZ=Asia/Shanghai
- EUREKA_HOST=eurekaNodeC
- EUREKA_ZONE_URL=http://eurekaNodeA:8080/eureka/,http://eurekaNodeB:8080/eureka/
- spring.profiles.active=cluster
- SERVER_PORT=8080
- JAVA_OPTS=-XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=128m -Xms1024m -Xmx1024m -Xmn256m -Xss256k -XX:SurvivorRatio=8 -XX:+UseConcMarkSweepGC -XX:+PrintGCDetails
networks:
- eureka-net
ports:
- "8083:8080"
networks:
eureka-net:
driver: bridge
name: eureka-net # 指定最终生成的网络名
最终代码地址,请查看。喜欢就留个言,点个赞。