大师SpringCloud系列-服务注册与发现&Docker

服务注册与发现,主要是使用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 # 指定最终生成的网络名

 

 

最终代码地址,请查看。喜欢就留个言,点个赞。

代码地址

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值