根项目建立

  • 建立一个maven项目,删除src目录,然后编辑pom.xml文件
    其中核心部分就是SpringCloud、SpringBoot、SpringCloudAlibaba的版本号
    • Spring Cloud Version: Spring Cloud Hoxton.SR8
    • Spring Cloud Alibaba Version: 2.2.5.RELEASE
    • Spring Boot Version: 2.3.2.RELEASE
<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.spz.demo</groupId>
    <artifactId>spring-cloud-demo</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>pom</packaging>

    <modules>
        <!-- <module>api-common</module>
        <module>ms-provider</module>
        <module>ms-consumer</module>
        <module>eureka-server</module> -->
    </modules>

    <!-- 统一管理jar包版本 -->
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>

        <junit.version>4.12</junit.version>
        <log4j.version>1.2.17</log4j.version>
        <lombok.version>1.16.18</lombok.version>
        <mysql.version>8.0.16</mysql.version>
        <druid.version>1.1.16</druid.version>
        <mybatis.plus.version>3.3.2</mybatis.plus.version>
        <jackson-version>2.9.9</jackson-version>
    </properties>

    <dependencyManagement>
        <dependencies>

            <!-- Spring Boot-->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>2.3.2.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>

            <!-- Spring Cloud -->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Hoxton.SR8</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>

            <!-- Spring Cloud Alibaba -->
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>2.2.5.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>

            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <version>${mysql.version}</version>
            </dependency>

            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>druid</artifactId>
                <version>${druid.version}</version>
            </dependency>

            <dependency>
                <groupId>com.baomidou</groupId>
                <artifactId>mybatis-plus-boot-starter</artifactId>
                <version>${mybatis.plus.version}</version>
            </dependency>


            <dependency>
                <groupId>log4j</groupId>
                <artifactId>log4j</artifactId>
                <version>${log4j.version}</version>
            </dependency>

            <dependency>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
                <version>${lombok.version}</version>
                <optional>true</optional>
            </dependency>

        </dependencies>
    </dependencyManagement>
</project>

项目结构

  • eureka-server: Eureka服务端
  • ms-consumer: 服务消费者
  • ms-provider: 服务提供者
  • api-common: 公共模块
    [SpringCloud教程]3. Eureka服务注册中心集成-LMLPHP

Eureka 服务注册中心 服务端(eureka-server)

首先需要在根pom.xml的modules标签下加入该模块:

<modules>
    <module>api-common</module>
    <!--
    <module>ms-provider</module>
    <module>ms-consumer</module> -->
    <module>eureka-server</module>
</modules>

单节点 Eureka Server 节点搭建

  • 在根项目下建立eureka-server目录,然后在eureka-server目录下建立pom.xml,粘贴如下代码:
<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>com.spz.demo</groupId>
        <artifactId>spring-cloud-demo</artifactId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <artifactId>eureka-server</artifactId>
    <packaging>jar</packaging>

    <description>Eureka注册中心</description>

    <dependencies>

        <!-- Eureka Server-->
        <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>com.spz.demo</groupId>
            <artifactId>api-common</artifactId>
            <version>${project.version}</version>
        </dependency>

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

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>

    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <executions>
                    <execution>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
                <configuration>
                    <excludes>
                        <exclude>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                        </exclude>
                    </excludes>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                </configuration>
            </plugin>
        </plugins>
        <resources>
            <resource>
                <directory>src/main/resources</directory>
                <filtering>true</filtering>
            </resource>
        </resources>
    </build>

</project>

  • 建立src/main/java和src/main/resources目录
  • 在src/main/java目录下建立包com.spz.demo.scloud.register.eureka

[SpringCloud教程]3. Eureka服务注册中心集成-LMLPHP

  • 在eureka包下建立启动类 RegisterServerEureka.java
package com.spz.demo.scloud.register.eureka;

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

@SpringBootApplication
@EnableEurekaServer
public class RegisterServerEureka {
    public static void main(String[] args) {
        SpringApplication.run(RegisterServerEureka.class, args);
    }
}
  • 在src/main/resources目录下建立application.properties文件
    • eureka.client.service-url.defaultZone: 这里只需要配置除自己以外的其他服务端节点,因为是将本节点注册给其他注册中心,来实现互相注册的高可用集群
server.port=6001
spring.application.name=@project.artifactId@

# Eureka 配置
# Eureka Server 实例 hostname
eureka.instance.hostname=eureka6001
# 服务端不需要注册自己
eureka.client.register-with-eureka=false
# 服务端不需要检索服务
eureka.client.fetch-registry=false
# Eureka Server 向其他服务端注册自己,实现Eureka的高可用集群
eureka.client.service-url.defaultZone=http://eureka6002:6002/eureka,http://eureka6003:6003/eureka
# 关闭自我保护机制,保证不可用服务被及时踢除,建议生产环境保持默认
#eureka.server.enable-self-preservation=false
#eureka.server.eviction-interval-timer-in-ms=2000

高可用 Eureka Server 集群实现

eureka 服务端实例实现高可用集群的方法是多个Eureka Server节点互相注册。比如A、B、C三个节点,A把自己作为Eureka客户端注册到B、C节点;B把自己注册到A、C节点;C把自己注册到A、B节点。这样三个节点互相具备其他服务端节点的信息,客户端列表数据也相当于保存了三分,这时候某个服务端节点失效,并不会造成客户端信息缺失,由此实现了高可用集群。下面介绍高可用集群实现方法:

  • 配置Eureka 服务端节点所属服务器的hosts,这里采用本地部署多个Eureka服务端的方案代替
    假设三个Eureka服务端节点的hostname分别为eureka6001、eureka6002、eureka6003。(注意:不配置hosts会导致Eureka集群无法进行备份,因为必须保证每个节点的hostname不同)
127.0.0.1  eureka6001
127.0.0.1  eureka6002
127.0.0.1  eureka6003
  • IDEA方式启动 - eureka6001节点配置
    [SpringCloud教程]3. Eureka服务注册中心集成-LMLPHP
    vm options:
-Dserver.port=6001
-Deureka.instance.hostname=eureka6001
-Deureka.client.service-url.defaultZone=http://eureka6002:6002/eureka,http://eureka6003:6003/eureka
  • IDEA方式启动 - eureka6002节点配置

[SpringCloud教程]3. Eureka服务注册中心集成-LMLPHP
vm options:

-Dserver.port=6002
-Deureka.instance.hostname=eureka6002
-Deureka.client.service-url.defaultZone=http://eureka6001:6001/eureka,http://eureka6003:6003/eureka
  • IDEA方式启动 - eureka6003节点配置

[SpringCloud教程]3. Eureka服务注册中心集成-LMLPHP
vm options:

-Dserver.port=6003
-Deureka.instance.hostname=eureka6003
-Deureka.client.service-url.defaultZone=http://eureka6002:6002/eureka,http://eureka6001:6001/eureka

[SpringCloud教程]3. Eureka服务注册中心集成-LMLPHP
如图eureka6001节点的DS Replicas出现了另外两个相邻节点,说明这三个节点组成了一个集群,这时候访问另外两个节点的管理页,也能同样看到DS Replicas里出现其他两个节点。另外,当有客户端注册进服务端时,三个服务端节点里应该有同一份的客户端列表信息。至此Eureka集群搭建成功。

服务提供者集群(ms-provider)

首先需要在根pom.xml的modules标签下加入该模块:

<modules>
    <module>api-common</module>
    <module>ms-provider</module>
    <!-- <module>ms-consumer</module> -->
    <module>eureka-server</module>
</modules>

单节点ms-provider搭建

  • 在根项目下建立ms-provider目录,然后在ms-provider目录下建立pom.xml,粘贴如下代码:
<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>com.spz.demo</groupId>
        <artifactId>spring-cloud-demo</artifactId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <artifactId>ms-provider</artifactId>
    <packaging>jar</packaging>

    <description>服务提供者模块</description>

    <dependencies>

        <!-- sleuth zipkin 服务追踪 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-zipkin</artifactId>
        </dependency>

        <!-- eureka client -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>

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

        <dependency>
            <groupId>com.spz.demo</groupId>
            <artifactId>api-common</artifactId>
            <version>${project.version}</version>
        </dependency>

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

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>

    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <executions>
                    <execution>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
                <configuration>
                    <excludes>
                        <exclude>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                        </exclude>
                    </excludes>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                </configuration>
            </plugin>
        </plugins>
        <resources>
            <resource>
                <directory>src/main/resources</directory>
                <filtering>true</filtering>
            </resource>
        </resources>
    </build>

</project>

  • 建立src/main/java和src/main/resources目录
  • 在src/main/resources下建立application.properties文件
    • eureka.client.service-url.defaultZone: 这里配置的是Eureka服务端集群,启动后该服务将把自己注册进Eureka注册中心集群
    • spring.application.name: 将作为服务名注册进Eureka注册中心(使用RestTemplate+负载均衡来调用Eureka服务时,服务名不能有下划线)
server.port=8001
spring.application.name=MS-PROVIDER

# 服务追踪
#spring.zipkin.base-url=http://localhost:9411
#采样率值介于 0 到 1 之间,1 则表示全部采集
#spring.sleuth.sampler.probability=1

# eureka 配置
# 是否将自己注册进 EurekaServer 默认为true
eureka.client.register-with-eureka=true
# 是否从 EurekaServer 抓取已有的注册信息,默认为true。单节点无所谓,集群必须设置为true才能配合ribbon使用负载均衡
eureka.client.fetchRegistry=true
eureka.client.service-url.defaultZone=http://eureka6001:6001/eureka,http://eureka6002:6002/eureka,http://eureka6003:6003/eureka
# 实例ID
eureka.instance.instance-id=${spring.application.name}-${server.port}
# 访问路径可以显示IP地址
eureka.instance.prefer-ip-address=true
# Eureka客户端向服务端发送心跳的时间间隔,单位为秒(默认是30秒)
eureka.instance.lease-renewal-interval-in-seconds=1
# Eureka服务端在收到最后一次心跳后等待时间上限,单位为秒(默认是90秒),超时将剔除服务
eureka.instance.lease-expiration-duration-in-seconds=10


  • 在src/main/java目录下建立包com.spz.demo.scloud.provider
  • 在provider包下建立其他包、类和启动类

[SpringCloud教程]3. Eureka服务注册中心集成-LMLPHP

  • IndexController.java
    package com.spz.demo.scloud.provider.controller;
    
    import com.spz.demo.scloud.common.core.bean.RestBean;
    import com.spz.demo.scloud.common.service.AppService;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    @RestController
    @RequestMapping("")
    public class IndexController {
    
        @Autowired
        private AppService appService;
    
        /**
        * 获取项目信息
        * @return
        */
        @RequestMapping("/projectInfo")
        public RestBean projectInfo(){
            String msg = appService.instanceNameAndPort();
            return RestBean.ok(msg);
        }
    
    }
    
    
  • AppServiceImpl.java
    注意该该类实现的AppService.java接口存放于api-common包,该包代码请在此处查看(https://gitee.com/spzmmd/spring-cloud-demo)
    package com.spz.demo.scloud.provider.service;
    
    import com.spz.demo.scloud.common.service.AppService;
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.stereotype.Service;
    
    /**
    * App Service 接口实现类
    */
    @Service
    public class AppServiceImpl implements AppService {
    
        /**
        * 项目端口
        */
        @Value("${server.port}")
        private Integer projectServerPort;
    
        /**
        * 项目名称
        */
        @Value("${spring.application.name}")
        private String projectApplicationName;
    
        @Override
        public String instanceNameAndPort(){
            return projectApplicationName + ":" + projectServerPort;
        }
    
    }
    
    
  • ProviderApp.java 启动类
    package com.spz.demo.scloud.provider;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
    import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
    
    @EnableEurekaClient
    @EnableDiscoveryClient
    @SpringBootApplication
    public class ProviderApp {
        public static void main(String[] args) {
            SpringApplication.run(ProviderApp.class, args);
        }
    }
    

集群实现

客户端服务(这里是本机,所以只需要配置一次,如果是不同服务器则需要配置)也需要配置hosts,不然无法访问Eureka注册中心集群

127.0.0.1  eureka6001
127.0.0.1  eureka6002
127.0.0.1  eureka6003
  • IDEA方式启动 - 8001节点

[SpringCloud教程]3. Eureka服务注册中心集成-LMLPHP
vm options:

-Dserver.port=8001
-Deureka.client.service-url.defaultZone=http://eureka6001:6001/eureka,http://eureka6002:6002/eureka,http://eureka6003:6003/eureka
  • IDEA方式启动 - 8002节点

[SpringCloud教程]3. Eureka服务注册中心集成-LMLPHP
vm options:

-Dserver.port=8002
-Deureka.client.service-url.defaultZone=http://eureka6001:6001/eureka,http://eureka6002:6002/eureka,http://eureka6003:6003/eureka
  • IDEA方式启动
    启动ProviderApp8001、ProviderApp8002即可,启动后分别访问三个注册中心的管理端:

  • 访问三个注册中心管理端,应该均可以看到这里有相同的客户端信息

    • MS-PROVIDER-8001: 这里是在application.properties里的"eureka.instance.instance-id"配置的,也即是实例ID
    • MS-PROVIDER: 这里是在application.properties里的"spring.application.name"配置的,也即是服务名(使用RestTemplate+负载均衡来调用Eureka服务时,服务名不能有下划线)

[SpringCloud教程]3. Eureka服务注册中心集成-LMLPHP
服务提供者集群搭建完成

服务消费者实例(ms-consumer)

首先需要在根pom.xml的modules标签下加入该模块:

<modules>
    <module>api-common</module>
    <module>ms-provider</module>
    <module>ms-consumer</module>
    <module>eureka-server</module>
</modules>

单节点ms-consumer搭建

  • 在根项目下建立ms-consumer目录,然后在ms-consumer目录下建立pom.xml,粘贴如下代码:
<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>com.spz.demo</groupId>
        <artifactId>spring-cloud-demo</artifactId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <artifactId>ms-consumer</artifactId>
    <packaging>jar</packaging>

    <description>消费者模块</description>

    <dependencies>

        <!-- sleuth zipkin 服务追踪 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-zipkin</artifactId>
        </dependency>

        <!-- eureka client -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>

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

        <dependency>
            <groupId>com.spz.demo</groupId>
            <artifactId>api-common</artifactId>
            <version>${project.version}</version>
        </dependency>

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

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>

    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <executions>
                    <execution>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
                <configuration>
                    <excludes>
                        <exclude>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                        </exclude>
                    </excludes>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                </configuration>
            </plugin>
        </plugins>
        <resources>
            <resource>
                <directory>src/main/resources</directory>
                <filtering>true</filtering>
            </resource>
        </resources>
    </build>

</project>

  • 建立src/main/java和src/main/resources目录
  • 在src/main/resources下建立application.properties文件
    • eureka.client.service-url.defaultZone: 这里配置的是Eureka服务端集群,启动后该服务将把自己注册进Eureka注册中心集群
    • spring.application.name: 将作为服务名注册进Eureka注册中心
server.port=7001
spring.application.name=MS-CONSUMER

# 服务追踪
#spring.zipkin.base-url=http://localhost:9411
#采样率值介于 0 到 1 之间,1 则表示全部采集
#spring.sleuth.sampler.probability=1

# Eureka 注册中心配置
# 是否将自己注册进 Eureka Server 默认为true
eureka.client.register-with-eureka=true
# 实例ID
eureka.instance.instance-id=${spring.application.name}-${server.port}
# 访问路径可以显示IP地址
eureka.instance.prefer-ip-address=true
# 是否从 Eureka Server 抓取已有的注册信息,默认为true 单节点无所谓,集群必须设置为true才能配合ribbon使用负载均衡
eureka.client.fetchRegistry=true
# Eureka Server 集群
eureka.client.service-url.defaultZone=http://eureka6001:6001/eureka,http://eureka6002:6002/eureka,http://eureka6003:6003/eureka
  • 在src/main/java目录下建立包com.spz.demo.scloud.consumer
  • 在consumer包下建立其他包、类和启动类

[SpringCloud教程]3. Eureka服务注册中心集成-LMLPHP

  • RestTemplateConfig.java
    • RestTemplate用于消费者远程访问服务提供者提供的接口
    • 注意需要@LoadBalanced注解,否则RestTemplate无法从服务提供者集群里获取实例
    package com.spz.demo.scloud.consumer.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;
    /**
    * RestTemplate 配置
    */
    @Configuration
    public class RestTemplateConfig {
        @Bean
        @LoadBalanced
        public RestTemplate getRestTemplate(){
            return new RestTemplate();
        }
    }
    
  • DiscoveryEurekaController.java
    用于测试Eureka注册中心
    package com.spz.demo.scloud.consumer.controller;
    
    import com.spz.demo.scloud.common.core.bean.RestBean;
    import com.spz.demo.scloud.common.service.AppService;
    import lombok.extern.slf4j.Slf4j;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.cloud.client.ServiceInstance;
    import org.springframework.cloud.client.discovery.DiscoveryClient;
    import org.springframework.cloud.client.loadbalancer.LoadBalanced;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.PathVariable;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    import org.springframework.web.client.RestTemplate;
    
    import javax.annotation.Resource;
    import java.net.URI;
    import java.util.List;
    
    /**
    * 注册中心 - Eureka - 测试接口
    */
    @Slf4j
    @RestController
    @RequestMapping("/discovery/eureka")
    public class DiscoveryEurekaController {
    
        @Autowired
        private DiscoveryClient discoveryClient;
    
        @Autowired
        private RestTemplate restTemplate;
    
        /**
        * 服务远程调用测试 - 使用 RestTemplate
        * @see AppService#instanceNameAndPort()
        * @return
        */
        @RequestMapping("/appService/projectInfo")
        public RestBean appServiceProjectInfo(){
            RestBean restBean = restTemplate.postForObject("http://MS-PROVIDER/projectInfo",null, RestBean.class);
            return restBean;
        }
    
        /**
        * 获取已在 Eureka Server 注册的服务名称列表
        * 注意不是服务名下的实例名称列表,是 Eureka的Application名称列表
        * @return
        */
        @RequestMapping("/services")
        public RestBean services(){
            List<String> services = discoveryClient.getServices();
            return RestBean.ok(services);
        }
    
        /**
        * 根据名称获取实例列表
        * 1. 如多个服务注册到Eureka服务端,他们的名称均为MS-PROVIDER,则使用MS-PROVIDER可查询出所有已注册实例
        * 2. 获取到ServiceInstance对象里包含实例的ServiceId、host、port、uri等
        * @param name eg. MS-PROVIDER
        * @return
        */
        @GetMapping("/instances/{name}")
        public RestBean instancesByName(@PathVariable(name = "name", required = true) String name){
            List<ServiceInstance> instances = discoveryClient.getInstances(name);
            return RestBean.ok(instances);
        }
    }
    
  • ConsumerApp.java 启动类
    package com.spz.demo.scloud.consumer;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
    import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
    
    @EnableEurekaClient
    @EnableDiscoveryClient
    @SpringBootApplication
    public class ConsumerApp {
        public static void main(String[] args) {
            SpringApplication.run(ConsumerApp.class, args);
        }
    }
    
  • IDEA方式启动 - 7001节点

[SpringCloud教程]3. Eureka服务注册中心集成-LMLPHP
vm options:

-Dserver.port=7001
-Deureka.client.service-url.defaultZone=http://eureka6001:6001/eureka,http://eureka6002:6002/eureka,http://eureka6003:6003/eureka
  • 启动后,不断访问如下地址
http://localhost:7001/discovery/eureka/appService/projectInfo

可以发现返回的端口号会在8001和8002之间交替变化,说明服务提供者注册的两个实例均可以访问

{
"code": 2000,
"message": "MS-PROVIDER:8001",
"data": null
}

{
"code": 2000,
"message": "MS-PROVIDER:8002",
"data": null
}

集群实现

于服务提供者集群实现方式相似,这里不再赘述

参考

交流&联系

  • QQ群
    欢迎加入Java交流群(qq群号: 776241689 )

  • 公众号
    PS:小到Java后端技术、计算机基础知识,大到微服务、Service Mesh、大数据等,都是本人研究的方向。我将定期在公众号中分享技术干货,希望以我一己之力,抛砖引玉,帮助朋友们提升技术能力,共同进步!
    [SpringCloud教程]3. Eureka服务注册中心集成-LMLPHP

  • 博客

04-08 01:02