群晖、NAS、PVE、飞牛、二手品牌机、垃圾佬

每一位热爱生活的垃圾佬都值得敬畏

Spring Cloud(Kilburn 2022.0.2版本)系列教程(一) eureka

Spring Cloud(Kilburn 2022.0.2版本)系列教程(一) eureka 为了更好的浏览体 […]

Spring Cloud(Kilburn 2022.0.2版本)系列教程(一) eureka

为了更好的浏览体验,欢迎光顾勤奋的凯尔森同学个人博客http://www.huerpu.cc:7000

小景哥哥是一个追求完美的人,所以纵观各位大神的SpringCloud教程,发现版本都比较低,所以出于对新技术的追求,特出此最新版本(Spring Cloud(Kilburn 2022.0.2版本)截止写此博客时)的教程,如有错误恳请大家批评指正,与大家共同学习、一起成长,万分感谢。

一、构建环境

Spring Cloud的构建工具可以使用MavenGradle,但Maven任然是主流。本文档所使用的开发环境如下:

环境参数 版本
JDK 17
Maven 3.9.1
Spring Cloud 4.0.2
IDE idea2023.1 U
OS Windows11专业版

Spring Cloud相关模块

模块 说明
Eureka 服务注册中心,用于服务管理
Ribbon 基于客户端的负载均衡组件
Hystrix 容错框架,能够防止服务的雪崩效应
Feign Web服务客户端,能够简化HTTP接口的调用
Zuul API网关,提供路由转发、请求过滤等功能
Config 分布式配置管理
Sleuth 服务跟踪
Stream 构建消息驱动的微服务应用程序的框架
Bus 消息代理的集群消息总线

Spring Cloud主要有5大组件,分别为服务发现组件EurekaFeignRibbonZuulHystrix。但很多都弃用了,比如Ribbon等。

注:SpringCloud版本说明

英文 中文 boot大版本 boot代表
Angel 安吉尔 1.2.X 1.2.8
Brixton 布里克斯顿 1.3.X 1.3.8
Camden 卡梅登 1.4.X 1.4.2
Dalston 达斯顿 1.5.X 1.5.0
Edgware 艾奇韦尔 1.5.X 1.5.19
Finchley 芬奇利 2.0.X 2.0.8
Greenwich 格林威治 2.1.X 2.1.2
Hoxton 霍克斯顿 2.2.X 2.2.6
2020.0.6-aka Ilford 埃福的 2.5.7 2.5.7
2021.0.6 Jubilee 朱比利 2.6.x 2.6.1
2022.0.0 Kilburn 基尔伯恩 3.0.x 3.0.5

二、微服务注册与发现

Spring Cloud提供了很多服务发现组件,比如:EurekaConsulZooKeeper等。而EurekaNetflix开源的服务发现组件,它包含Server和Client两部分。Eureka Server提供服务发现的能力,每个微服务启动时,都会向Eureka Server注册自己的信息(IP、端口、微服务名称等),Eureka Server存储记录每个微服务的这些信息。Eureka Client是用于简化与Eureka Server交互的Java客户端。微服务启动后,会周期性地(默认30s)向Eureka Server发送心跳以续约自己的可用时间。如果Eureka Server在规定的时间内没有接收到微服务实例的心跳,Eureka Server则会将该实例注销(默认90s)。

常见的注册中心

组件名 语言 CAP 一致性算法 服务健康检查 对外暴露接口
Eureka Java AP 可配支持 HTTP
Consul Go CP Raft 支持 HTTP/DNS
Zookeeper Java CP Paxos 支持 客户端
Nacos Java AP Raft 支持 HTTP

2.1 创建EurekaServer

在idea中,创建一个名称为eurekaServerMaven工程。

001

002

222

004

pom.xml文件增加Eureka依赖

<?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>3.0.5</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>cc.huerpu</groupId>
    <artifactId>eurekaServer</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>eurekaServer</name>
    <description>eurekaServer</description>
    <properties>
        <java.version>17</java.version>
        <spring-cloud.version>2022.0.2</spring-cloud.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>2022.0.2</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>
    <repositories>
        <repository>
            <id>netflix-candidates</id>
            <name>Netflix Candidates</name>
            <url>https://artifactory-oss.prod.netflix.net/artifactory/maven-oss-candidates</url>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
        </repository>
    </repositories>

</project>

修改EurekaServerApplication启动类,增加@EnableEurekaServer注解。

package cc.huerpu.eurekaserver;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;

@SpringBootApplication
@EnableEurekaServer
public class EurekaServerApplication {

    public static void main(String[] args) {
        SpringApplication.run(EurekaServerApplication.class, args);
    }

}

创建application.yml文件

server:
  port: 8761 # 端口号

spring:
  application:
    name: eurekaServer # Eureka名称

eureka:
  instance:
    prefer-ip-address: false
    hostname: eurekaServer
  client:
    fetch-registry: false # 表示是否从EurekaServer获取注册信息,默认为true。因为本应用是一个单点的EurekaServer,不需要同步其他的EurekaServer节点的数据,因此设为false。
    register-with-eureka: false # 是否将自己注册到EurekaServer,默认为true。由于当前应用就是EurekaServer,因此设为false。
    service-url:
      defaultZone: http://eurekaServer:8761/eureka/

修改系统的hostsWindows10hosts文件路径为:C:\Windows\System32\drivers\etc\hostsLinuxmacOS的文件路径为/etc/hosts。增加一行:127.0.0.1 eurekaServer

启动项目,并测试访问

点击idea的项目启动按钮,并访问http:localhost:8761查看Eureka首页。

005

2.2 创建EurekaClient,并让它注册到EurekaServer上。

复制eurekaServer项目,修改artifactIdEurekaClient。修改application.yml文件,端口号为8000,应用名称为eurekaClient

server:
  port: 8000 # 端口号

spring:
  application:
    name: eurekaClient # Eureka名称

info:
  app:
    name: eurekaClient
    encoding: "UTF-8"
    java:
      source: "17"
      target: "17"
  company:
    name: www.huerpu.cc

management:
  info:
    env:
      enabled: true
  endpoints:
    web:
      exposure:
        include: "*"
    enabled-by-default: true

eureka:
  instance:
    prefer-ip-address: false
    hostname: eurekaClient
  client:
    healthcheck:
      enabled: true
    fetch-registry: true 
    register-with-eureka: true 
    service-url:
      defaultZone: http://eurekaServer:8761/eureka/

修改启动类,增加@EnableDiscoveryClient注解。

package cc.huerpu.eurekaclient;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

@SpringBootApplication
@EnableDiscoveryClient
public class EurekaClientApplication {

    public static void main(String[] args) {
        SpringApplication.run(EurekaClientApplication.class, args);
    }

}

编写一个测试接口,最简单的那种就好。

@RestController
public class UserController {

    @RequestMapping("/getUserById")
    public String getUserById(){

        return "{id:1,name:jason,age:23}";
    }

}

修改pom.xml文件,把几处地方改为eurekaClient,另外增加了一个actuator包。

<?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>3.0.5</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>cc.huerpu</groupId>
    <artifactId>eurekaClient</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>eurekaClient</name>
    <description>eurekaClient</description>
    <properties>
        <java.version>17</java.version>
        <spring-cloud.version>2022.0.2</spring-cloud.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-actuator</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>2022.0.2</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>
    <repositories>
        <repository>
            <id>netflix-candidates</id>
            <name>Netflix Candidates</name>
            <url>https://artifactory-oss.prod.netflix.net/artifactory/maven-oss-candidates</url>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
        </repository>
    </repositories>

</project>

启动项目,刷新http://localhost:8761/会看到EurekaClient注册上来了。

111

2.3 创建EurekaServer集群

一般来说,EurekaServer不会仅仅只有一个节点,都是用集群来达到高可用的,所以接下来创建有两个节点的EurekaServer集群,让这两个节点互相注册,从而保证EurekaServer的高可用。

①修改系统的hostsWindows10hosts文件路径为:C:\Windows\System32\drivers\etc\hostsLinuxmacOS的文件路径为/etc/hosts

增加一行:127.0.0.1 eurekaServerHA

②复制EurekaServer项目,修改artifactIdEurekaServerHA

③修改EurekaServerHAapplication.yml文件,修改端口号为8762,应用名为eurekaServer,和EurekaServer的一样,defaultZone http://eurekaServer:8761/eureka/fetch-registryregister-with-eureka都改为true。增加hostname: eurekaServerHAprefer-ip-address: false

server:
  port: 8762 # 端口号

spring:
  application:
    name: eurekaServer # Eureka名称

eureka:
  instance:
    prefer-ip-address: false
    hostname: eurekaServerHA
  client:
    fetch-registry: true 
    register-with-eureka: true 
    service-url:
      defaultZone: http://eurekaServer:8761/eureka/

④修改EurekaServerapplication.yml文件,修改defaultZone http://eurekaServerHA:8762/eureka/fetch-registryregister-with-eureka都改为true

server:
  port: 8761 # 端口号

spring:
  application:
    name: eurekaServer # Eureka名称

eureka:
  instance:
    prefer-ip-address: false
    hostname: eurekaServer
  client:
    fetch-registry: true
    register-with-eureka: true 
    service-url:
      defaultZone: http://eurekaServerHA:8762/eureka/

⑤修改EurekaClientapplication.yml文件,修改defaultZonehttp://eurekaServer:8761/eureka/,http://eurekaServerHA:8762/eureka/。由此,两个节点的EurekaServer将会进行互相注册。访问第一个节点http://eurekaServer:8761,可以看到有eurekaServer:8761eurekaServer:8762

01

访问第二个节点http://eurekaServerHA:8762,可以看到有eurekaServer:8761eurekaServer:8762。至此,搭建具有两个节点的EurekaServer完毕。

02

2.4 添加EurekaServer用户认证

在实际应用中,资源的访问都是需要认证的,接下来我们把EurekaServerEurekaServerHA改造为需要认证的服务。

EurekaServerEurekaServerHA添加security依赖:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
</dependency>

修改EurekaServerapplication.yml文件,增加security认证,增加spring.security.user.namespring.security.user.password。并修改defaultZonehttp://eurekaha:eurekapwd@eurekaServerHA:8762/eureka/

server:
  port: 8761 # 端口号

spring:
  security:
    user:
      name: eureka
      password: eurekapwd
  application:
    name: eurekaServer # Eureka名称

eureka:
  instance:
    prefer-ip-address: false
    hostname: eurekaServer
  client:
    fetch-registry: true
    register-with-eureka: true
    service-url:
      defaultZone: http://eureka:eurekapwd@eurekaServerHA:8762/eureka/

修改EurekaServerHAapplication.yml文件,增加security认证,增加spring.security.user.namespring.security.user.password。并修改defaultZonehttp://eureka:eureka@eurekaServer:8761/eureka/

server:
  port: 8762 # 端口号

spring:
  security:
    user:
      name: eureka
      password: eurekapwd
  application:
    name: eurekaServer # Eureka名称

eureka:
  instance:
    prefer-ip-address: false
    hostname: eurekaServerHA
  client:
    fetch-registry: true
    register-with-eureka: true
    service-url:
      defaultZone: http://eureka:eurekapwd@eurekaServer:8761/eureka/

修改EurekaClientapplication.yml文件,defaultZone http://eureka:eurekapwd@eurekaServer:8761/eureka/,http://eureka:eurekapwd@eurekaServerHA:8762/eureka/

server:
  port: 8000 # 端口号

spring:
  application:
    name: eurekaClient # Eureka名称

info:
  app:
    name: eurekaClient
    encoding: "UTF-8"
    java:
      source: "17"
      target: "17"
  company:
    name: www.huerpu.cc

management:
  info:
    env:
      enabled: true
  endpoints:
    web:
      exposure:
        include: "*"
    enabled-by-default: true

eureka:
  instance:
    prefer-ip-address: false
    hostname: eurekaClient
  client:
    healthcheck:
      enabled: true
    fetch-registry: true
    register-with-eureka: true
    service-url:
      defaultZone: http://eureka:eurekapwd@eurekaServer:8761/eureka/,http://eureka:eurekapwd@eurekaServerHA:8762/eureka/

分别在EurekaClientEurekaClientHAcc.huerpu.eurekaserver.security包路径下创建WebSecurityConfig类,关闭csrf,并开启httpBasic认证。

package cc.huerpu.eurekaserver.security;

import lombok.RequiredArgsConstructor;
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.web.SecurityFilterChain;

@Configuration
@AutoConfigureAfter(WebSecurityConfig.class)
@RequiredArgsConstructor
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class WebSecurityConfig
{
    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        http.csrf().disable();
        http.authorizeHttpRequests().anyRequest().authenticated().and().httpBasic();
        return http.build();
    }
}

重新启动项目,访问时需要认证登录。

101

102

输入配置文件里的账号/密码:eureka/eurekapwd进行登录。

108

109

如果你的没有注册上来,耐心等一分钟就可以了。

三、创建一个eurekaClientConsumer调用eurekaClient服务

复制eurekaClient项目,修改artifactIdeurekaClientConsumer。修改application.yml文件,端口号为8001,应用名称为eurekaClientConsumer(本机host中也增加这一个)。

<?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>3.0.5</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>cc.huerpu</groupId>
    <artifactId>eurekaClientConsumer</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>eurekaClientConsumer</name>
    <description>eurekaClientConsumer</description>
    <properties>
        <java.version>17</java.version>
        <spring-cloud.version>2022.0.2</spring-cloud.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-actuator</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</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>2022.0.2</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>
    <repositories>
        <repository>
            <id>netflix-candidates</id>
            <name>Netflix Candidates</name>
            <url>https://artifactory-oss.prod.netflix.net/artifactory/maven-oss-candidates</url>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
        </repository>
    </repositories>
</project>

application.yml

server:
  port: 8001 # 端口号

spring:
  application:
    name: eurekaClientConsumer # Eureka名称

info:
  app:
    name: eurekaClientConsumer
    encoding: "UTF-8"
    java:
      source: "17"
      target: "17"
  company:
    name: www.huerpu.cc

management:
  info:
    env:
      enabled: true
  endpoints:
    web:
      exposure:
        include: "*"
    enabled-by-default: true

eureka:
  instance:
    prefer-ip-address: false
    hostname: eurekaClientConsumer
  client:
    healthcheck:
      enabled: true
    fetch-registry: true
    register-with-eureka: true
    service-url:
      defaultZone: http://eureka:eurekapwd@eurekaServer:8761/eureka/,http://eureka:eurekapwd@eurekaServerHA:8762/eureka/

修改启动类名称为EurekaClientConsumerApplication,并增加注入一个restTemplate

package cc.huerpu.eurekaclient;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;

@SpringBootApplication
@EnableDiscoveryClient
public class EurekaClientConsumerApplication {

    public static void main(String[] args) {
        SpringApplication.run(EurekaClientConsumerApplication.class, args);
    }
    @Bean
    @LoadBalanced
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }
}

controller包下创建一个ConsumerController类,注入restTemplateeurekaClientdiscoveryClient

package cc.huerpu.eurekaclient.controller;

import com.netflix.appinfo.InstanceInfo;
import com.netflix.discovery.EurekaClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
import java.util.List;

@RestController
public class ConsumerController {
    @Autowired
    private RestTemplate  restTemplate;
    @Autowired
    private EurekaClient eurekaClient;

    @Autowired
    private DiscoveryClient discoveryClient;

    //获得eurekaClient的url
    @RequestMapping("/eurekaClientServiceUrl")
    private String eurekaClientServiceUrl() {
        InstanceInfo instance = eurekaClient.getNextServerFromEureka("eurekaClient", false);
        return instance.getHomePageUrl();
    }

    @RequestMapping("/consumerEurekaClient")
    public String consumerEurekaClient(){
        String eurekaClientURL = eurekaClientServiceUrl();
        String res = restTemplate.getForObject(eurekaClientURL + "/getUserById",String.class);
        return "consumerEurekaClient:" + res;
    }

    @RequestMapping("/eurekaClient-instance")
    public List<ServiceInstance> showInfo() {
        return this.discoveryClient.getInstances("eurekaClient");
    }
}

在没有服务注册中心的时候,eurekaClientConsumer服务调用eurekaClient服务,需要在eurekaClientConsumer服务代码里显式通过硬编码IP地址和端口号进行调用,也可以通过@Value注入配置的方式进行配置,但被调用方方的IP和端口号变化之后,调用方就必须进行修改,针对千千万万的接口来说,维护这些信息简直是场噩梦。

@RestController
public class ConsumerController {

    @RequestMapping("/consumerEurekaClient")
    public String consumerEurekaClient(){
        String res = restTemplate.getForObject("http://localhost:8000/getUserById", String.class);
        return "consumerEurekaClient:" + res;
    }

}
@RestController
public class ConsumerController {
        //通过配置文件中的hep.eurekaclient.userservice.url值进行配置
    @Value("${hep.eurekaclient.userservice.url}")
    private String eurekaClient;
    @RequestMapping("/consumerEurekaClient")
    public String consumerEurekaClient(){
        String res = restTemplate.getForObject("http://localhost:8000/getUserById", String.class);
        return "consumerEurekaClient:" + res;
    }
}

但现在我们通过eureka就没有这个烦恼啦,只需要eurekaClient.getNextServerFromEureka("eurekaClient", false),就可以获得服务的调用地址,其中"eurekaClient"是由spring.application.name指定的,即使被调用方的IP和端口号变化,对我们来说都是无感的,调用方这边完全不用做任何修改,是不是很开心?

访问http://eurekaclientconsumer:8001/consumerEurekaClient,就可以得到consumerEurekaClient:{id:1,name:jason,age:23},证明我们的消费方consumerEurekaClient调用被消费方eurekaClient成功了。

image-20230420150333493

四、Eureka 的元数据

Eureka 的元数据有两种,标准元数据和自定义元数据。标准元数据有主机名、IP地址、端口号、状态页和健康检查等信息,这些信息都会被发布在服务注册表中,用于服务之间的调用。自定义元数据可以使用eureka.instance.metadata-map配置。

可以通过http://localhost:8761/eureka/apps来查看eureka中有哪些应用。

<applications>
    <versions__delta>1</versions__delta>
    <apps__hashcode>UP_4_</apps__hashcode>
    <application>
        <name>EUREKASERVER</name>
        <instance>
            <instanceId>192.168.1.97:eurekaServer:8761</instanceId>
            <hostName>eurekaServer</hostName>
            <app>EUREKASERVER</app>
            <ipAddr>192.168.1.97</ipAddr>
            <status>UP</status>
            <overriddenstatus>UNKNOWN</overriddenstatus>
            <port enabled="true">8761</port>
            <securePort enabled="false">443</securePort>
            <countryId>1</countryId>
            <dataCenterInfo class="com.netflix.appinfo.InstanceInfo$DefaultDataCenterInfo">
                <name>MyOwn</name>
            </dataCenterInfo>
            <leaseInfo>
                <renewalIntervalInSecs>5</renewalIntervalInSecs>
                <durationInSecs>90</durationInSecs>
                <registrationTimestamp>1681976869304</registrationTimestamp>
                <lastRenewalTimestamp>1681976869304</lastRenewalTimestamp>
                <evictionTimestamp>0</evictionTimestamp>
                <serviceUpTimestamp>1681976869305</serviceUpTimestamp>
            </leaseInfo>
            <metadata>
                <management.port>8761</management.port>
            </metadata>
            <homePageUrl>http://eurekaServer:8761/</homePageUrl>
            <statusPageUrl>http://eurekaServer:8761/actuator/info</statusPageUrl>
            <healthCheckUrl>http://eurekaServer:8761/actuator/health</healthCheckUrl>
            <vipAddress>eurekaServer</vipAddress>
            <secureVipAddress>eurekaServer</secureVipAddress>
            <isCoordinatingDiscoveryServer>true</isCoordinatingDiscoveryServer>
            <lastUpdatedTimestamp>1681976869305</lastUpdatedTimestamp>
            <lastDirtyTimestamp>1681976839602</lastDirtyTimestamp>
            <actionType>ADDED</actionType>
        </instance>
        <instance>
            <instanceId>192.168.1.97:eurekaServer:8762</instanceId>
            <hostName>eurekaServerHA</hostName>
            <app>EUREKASERVER</app>
            <ipAddr>192.168.1.97</ipAddr>
            <status>UP</status>
            <overriddenstatus>UNKNOWN</overriddenstatus>
            <port enabled="true">8762</port>
            <securePort enabled="false">443</securePort>
            <countryId>1</countryId>
            <dataCenterInfo class="com.netflix.appinfo.InstanceInfo$DefaultDataCenterInfo">
                <name>MyOwn</name>
            </dataCenterInfo>
            <leaseInfo>
                <renewalIntervalInSecs>5</renewalIntervalInSecs>
                <durationInSecs>90</durationInSecs>
                <registrationTimestamp>1681976841173</registrationTimestamp>
                <lastRenewalTimestamp>1681976977251</lastRenewalTimestamp>
                <evictionTimestamp>0</evictionTimestamp>
                <serviceUpTimestamp>1681976841173</serviceUpTimestamp>
            </leaseInfo>
            <metadata>
                <management.port>8762</management.port>
            </metadata>
            <homePageUrl>http://eurekaServerHA:8762/</homePageUrl>
            <statusPageUrl>http://eurekaServerHA:8762/actuator/info</statusPageUrl>
            <healthCheckUrl>http://eurekaServerHA:8762/actuator/health</healthCheckUrl>
            <vipAddress>eurekaServer</vipAddress>
            <secureVipAddress>eurekaServer</secureVipAddress>
            <isCoordinatingDiscoveryServer>false</isCoordinatingDiscoveryServer>
            <lastUpdatedTimestamp>1681976841173</lastUpdatedTimestamp>
            <lastDirtyTimestamp>1681976841049</lastDirtyTimestamp>
            <actionType>ADDED</actionType>
        </instance>
    </application>
    <application>
        <name>EUREKACLIENT</name>
        <instance>
            <instanceId>192.168.1.97:eurekaClient:8000</instanceId>
            <hostName>eurekaClient</hostName>
            <app>EUREKACLIENT</app>
            <ipAddr>192.168.1.97</ipAddr>
            <status>UP</status>
            <overriddenstatus>UNKNOWN</overriddenstatus>
            <port enabled="true">8000</port>
            <securePort enabled="false">443</securePort>
            <countryId>1</countryId>
            <dataCenterInfo class="com.netflix.appinfo.InstanceInfo$DefaultDataCenterInfo">
                <name>MyOwn</name>
            </dataCenterInfo>
            <leaseInfo>
                <renewalIntervalInSecs>5</renewalIntervalInSecs>
                <durationInSecs>90</durationInSecs>
                <registrationTimestamp>1681976840091</registrationTimestamp>
                <lastRenewalTimestamp>1681976981077</lastRenewalTimestamp>
                <evictionTimestamp>0</evictionTimestamp>
                <serviceUpTimestamp>1681976840091</serviceUpTimestamp>
            </leaseInfo>
            <metadata>
                <management.port>8000</management.port>
            </metadata>
            <homePageUrl>http://eurekaClient:8000/</homePageUrl>
            <statusPageUrl>http://eurekaClient:8000/actuator/info</statusPageUrl>
            <healthCheckUrl>http://eurekaClient:8000/actuator/health</healthCheckUrl>
            <vipAddress>eurekaClient</vipAddress>
            <secureVipAddress>eurekaClient</secureVipAddress>
            <isCoordinatingDiscoveryServer>false</isCoordinatingDiscoveryServer>
            <lastUpdatedTimestamp>1681976840092</lastUpdatedTimestamp>
            <lastDirtyTimestamp>1681976839916</lastDirtyTimestamp>
            <actionType>ADDED</actionType>
        </instance>
    </application>
    <application>
        <name>EUREKACLIENTCONSUMER</name>
        <instance>
            <instanceId>192.168.1.97:eurekaClientConsumer:8001</instanceId>
            <hostName>eurekaClientConsumer</hostName>
            <app>EUREKACLIENTCONSUMER</app>
            <ipAddr>192.168.1.97</ipAddr>
            <status>UP</status>
            <overriddenstatus>UNKNOWN</overriddenstatus>
            <port enabled="true">8001</port>
            <securePort enabled="false">443</securePort>
            <countryId>1</countryId>
            <dataCenterInfo class="com.netflix.appinfo.InstanceInfo$DefaultDataCenterInfo">
                <name>MyOwn</name>
            </dataCenterInfo>
            <leaseInfo>
                <renewalIntervalInSecs>5</renewalIntervalInSecs>
                <durationInSecs>90</durationInSecs>
                <registrationTimestamp>1681976869305</registrationTimestamp>
                <lastRenewalTimestamp>1681976869305</lastRenewalTimestamp>
                <evictionTimestamp>0</evictionTimestamp>
                <serviceUpTimestamp>1681976869305</serviceUpTimestamp>
            </leaseInfo>
            <metadata>
                <management.port>8001</management.port>
            </metadata>
            <homePageUrl>http://eurekaClientConsumer:8001/</homePageUrl>
            <statusPageUrl>http://eurekaClientConsumer:8001/actuator/info</statusPageUrl>
            <healthCheckUrl>http://eurekaClientConsumer:8001/actuator/health</healthCheckUrl>
            <vipAddress>eurekaClientConsumer</vipAddress>
            <secureVipAddress>eurekaClientConsumer</secureVipAddress>
            <isCoordinatingDiscoveryServer>false</isCoordinatingDiscoveryServer>
            <lastUpdatedTimestamp>1681976869305</lastUpdatedTimestamp>
            <lastDirtyTimestamp>1681976840542</lastDirtyTimestamp>
            <actionType>ADDED</actionType>
        </instance>
    </application>
</applications>

我们在上面也有写了一个接口,用来获得eurekaClient服务的相关实例。

@Autowired
private DiscoveryClient discoveryClient;

@RequestMapping("/eurekaClient-instance")
public List<ServiceInstance> showInfo() {
    return this.discoveryClient.getInstances("eurekaClient");
}
<List>
    <item>
        <scheme>http</scheme>
        <host>eurekaClient</host>
        <port>8000</port>
        <uri>http://eurekaClient:8000</uri>
        <secure>false</secure>
        <metadata>
            <management.port>8000</management.port>
        </metadata>
        <serviceId>EUREKACLIENT</serviceId>
        <instanceId>192.168.1.97:eurekaClient:8000</instanceId>
        <instanceInfo>
            <instanceId>192.168.1.97:eurekaClient:8000</instanceId>
            <app>EUREKACLIENT</app>
            <appGroupName/>
            <ipAddr>192.168.1.97</ipAddr>
            <sid>na</sid>
            <homePageUrl>http://eurekaClient:8000/</homePageUrl>
            <statusPageUrl>http://eurekaClient:8000/actuator/info</statusPageUrl>
            <healthCheckUrl>http://eurekaClient:8000/actuator/health</healthCheckUrl>
            <secureHealthCheckUrl/>
            <vipAddress>eurekaClient</vipAddress>
            <secureVipAddress>eurekaClient</secureVipAddress>
            <countryId>1</countryId>
            <dataCenterInfo _class="com.netflix.appinfo.InstanceInfo$DefaultDataCenterInfo">
                <name>MyOwn</name>
            </dataCenterInfo>
            <hostName>eurekaClient</hostName>
            <status>UP</status>
            <overriddenStatus>UNKNOWN</overriddenStatus>
            <leaseInfo>
                <renewalIntervalInSecs>5</renewalIntervalInSecs>
                <durationInSecs>90</durationInSecs>
                <registrationTimestamp>1681976866110</registrationTimestamp>
                <lastRenewalTimestamp>1681976866110</lastRenewalTimestamp>
                <evictionTimestamp>0</evictionTimestamp>
                <serviceUpTimestamp>1681976866110</serviceUpTimestamp>
            </leaseInfo>
            <isCoordinatingDiscoveryServer>false</isCoordinatingDiscoveryServer>
            <metadata>
                <management.port>8000</management.port>
            </metadata>
            <lastUpdatedTimestamp>1681976866110</lastUpdatedTimestamp>
            <lastDirtyTimestamp>1681976839916</lastDirtyTimestamp>
            <actionType>ADDED</actionType>
            <asgName/>
        </instanceInfo>
    </item>
</List>

五、Eureka的健康检查

在pom文件中引入Spring Boot Actuator,它提供了/health端点,该端点可展示应用程序的健康信息。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

引入Actuator后,在Eureka中开启健康检查。

eureka:
  client:
    healthcheck:
      enabled: true      #开启健康检查(依赖spring-boot-actuator)

访问http://localhost:8761/actuator/health可以查看Eureka的状态。

若出现下面红色警告,其实是Eureka进入自我保护模式。如果最近一分钟实际接收到的心跳值Renews除以期望的心跳阈值 Renews threshold小于等于0.85,即 Renews/Renews threshold≤0.85

$\textcolor{red}{EMERGENCY! EUREKA MAY BE INCORRECTLY CLAIMING INSTANCES ARE UP WHEN THEY'RE NOT. }$

$\textcolor{red}{RENEWALS ARE LESSER THAN THRESHOLD AND HENCE THE INSTANCES ARE NOT BEING EXPIRED}$

$\textcolor{red}{ JUST TO BE SAFE}$

可以把renewal-percent-threshold调的小一些

eureka:
  server:
    renewal-percent-threshold: 0.49

或者暴力一点关闭自我保护模式

# 默认值是true
eureka:
  server:
    enable-self-preservation: false

默认情况下,服务注册到Eureka Server的过程较慢。在开发或测试时,常常希望能够加速这一过程,从而提升工作效率。

##默认是30,单位秒。设成一个更小的值,该配置用于设置Eureka Client向Eureka Server发送心跳的时间间隔
eureka:
  instance:
    lease-renewal-interval-in-seconds: 5

六、上传到gitlab

6.1 gitlab创建空项目

101

102

103

6.2 idea上传项目到gitlab

idea设置git

201

上传项目到本地git仓库

202

104

105

106

6.3 项目上传到远程gitlab服务器

107

把复制过来的gitlab仓库地址贴过来。我这里是外网访问家里的服务器,用了往外的域名地址。

208

209

210

在gitlab页面就可以看到项目上传过来了。

211

可以让小伙伴去拉取项目进行开发与共享了。

代码共享地址:http://www.huerpu.cc:2080/root/springcloud

发表回复