Spring Cloud(Kilburn 2022.0.2版本)系列教程(一) 服务注册与发现(eureka)

本文档是Spring Cloud Kilburn 2022.0.2版本关于Eureka服务注册与发现的教程,包括创建Eureka Server,创建并注册服务,集群配置,添加用户认证,创建Eureka Client Consumer,Eureka元数据和健康检查。此外,还介绍了如何将项目上传到GitLab并部署到Ubuntu服务器。
摘要由CSDN通过智能技术生成

Spring Cloud(Kilburn 2022.0.2版本)系列教程(一) 服务注册与发现(eureka)

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

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

一、构建环境

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

环境参数版本
JDK17
Maven3.9.1
Spring Cloud4.0.2
IDEidea2023.1 U
OSWindows11专业版

Spring Cloud相关模块

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

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

注:SpringCloud版本说明

英文中文boot大版本boot代表
Angel安吉尔1.2.X1.2.8
Brixton布里克斯顿1.3.X1.3.8
Camden卡梅登1.4.X1.4.2
Dalston达斯顿1.5.X1.5.0
Edgware艾奇韦尔1.5.X1.5.19
Finchley芬奇利2.0.X2.0.8
Greenwich格林威治2.1.X2.1.2
Hoxton霍克斯顿2.2.X2.2.6
2020.0.6-aka Ilford埃福的2.5.72.5.7
2021.0.6 Jubilee朱比利2.6.x2.6.1
2022.0.0 Kilburn基尔伯恩3.0.x3.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一致性算法服务健康检查对外暴露接口
EurekaJavaAP可配支持HTTP
ConsulGoCPRaft支持HTTP/DNS
ZookeeperJavaCPPaxos支持客户端
NacosJavaAPRaft支持HTTP
2.1 创建EurekaServer

在idea中,创建一个名称为eurekaServerMaven工程。
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

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首页。

在这里插入图片描述

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注册上来了。

在这里插入图片描述

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

在这里插入图片描述

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

在这里插入图片描述

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

在这里插入图片描述

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

在这里插入图片描述

在这里插入图片描述

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

三、创建一个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

E M E R G E N C Y ! E U R E K A M A Y B E I N C O R R E C T L Y C L A I M I N G I N S T A N C E S A R E U P W H E N T H E Y ′ R E N O T . \textcolor{red}{EMERGENCY! EUREKA MAY BE INCORRECTLY CLAIMING INSTANCES ARE UP WHEN THEY'RE NOT. } EMERGENCY!EUREKAMAYBEINCORRECTLYCLAIMINGINSTANCESAREUPWHENTHEYRENOT.

R E N E W A L S A R E L E S S E R T H A N T H R E S H O L D A N D H E N C E T H E I N S T A N C E S A R E N O T B E I N G E X P I R E D \textcolor{red}{RENEWALS ARE LESSER THAN THRESHOLD AND HENCE THE INSTANCES ARE NOT BEING EXPIRED} RENEWALSARELESSERTHANTHRESHOLDANDHENCETHEINSTANCESARENOTBEINGEXPIRED

J U S T T O B E S A F E \textcolor{red}{ JUST TO BE SAFE} JUSTTOBESAFE

可以把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

本文参考SpringCloud官方文档:https://docs.spring.io/spring-cloud-netflix/docs/4.0.1/reference/html/

六、上传到gitlab

6.1 gitlab创建空项目

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

6.2 idea上传项目到gitlab

idea设置git

201

上传项目到本地git仓库
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

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

在这里插入图片描述

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

在这里插入图片描述

在这里插入图片描述

210

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

在这里插入图片描述

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

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

七、部署eurekaserver到ubuntu22.04服务器

每次都启动eureka的项目,太繁琐了,我们把eureka部署到Ubuntu,就可以愉快的玩耍了。

7.1 配置文件设置

准备了三台机器192.168.31.31192.168.31.32192.168.31.33 ubuntu22.04

eurekaserver项目,创建application-text.yml文件,内容如下

server:
  port: 8761 # 端口号

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

eureka:
  server:
    enable-self-preservation: true
  instance:
    prefer-ip-address: ture
  client:
    fetch-registry: true
    register-with-eureka: true
    service-url:
      defaultZone: http://eureka:eurekapwd@192.168.31.32:8761/eureka/,http://eureka:eurekapwd@192.168.31.33:8761/eureka/
      #defaultZone: http://eureka:eurekapwd@192.168.31.31:8761/eureka/,http://eureka:eurekapwd@192.168.31.33:8761/eureka/
      #defaultZone: http://eureka:eurekapwd@192.168.31.31:8761/eureka/,http://eureka:eurekapwd@192.168.31.32:8761/eureka/
  • 192.168.31.31192.168.31.32192.168.31.33 注册

  • 192.168.31.32192.168.31.31192.168.31.33 注册

  • 192.168.31.33192.168.31.31192.168.31.32 注册

application.properties中增加让test生效配置。

spring.profiles.active=test
7.2 生成eurekaserver的jar包

生成eurekaserver的jar包:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

或者更简单的使用install去生成,生成完成控制台有日志输出显示,生成的目录在哪里。

在这里插入图片描述

7.3 ubuntu安装jdk17
sudo su -

apt update

apt upgrade -y

apt install openjdk-17-jdk

java -version
7.4 运行eurekaServer-0.0.1-SNAPSHOT.jar包

我们把eurekaServer-0.0.1-SNAPSHOT.jar包 放在/usr/software目录下,根据个人喜好目录存放即可。使用MobaXterm等SSH工具上传即可。

cd /usr
#创建software文件夹,在此文件夹下有我们的eurekaServer-0.0.1-SNAPSHOT.jar包,可以通过上传工具上传过来
mkdir software
#赋予权限
chmod -R 777 software
#进入到software目录
cd software

#运行jar包
nohup java -jar eurekaServer-0.0.1-SNAPSHOT.jar > log.txt &

#开放8761端口
ufw allow 8761
ufw enable
7.5 验证eurekaserver服务

可以看到三台机器,两两相互注册了。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

勤奋的凯尔森同学

你的鼓励将是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值