新微服务项目多半采用Nacos作为服务注册与发现中心,但是旧项目可能使用Eureka、zookeeper、Consul、Nacos作为服务注册中心。

新项目建议使用Nacos作为服务注册中心

根项目建立

  • 建立一个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: 公共模块

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

  • 在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节点配置



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



vm options:

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



vm options:

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



如图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包下建立其他包、类和启动类

  • 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节点



vm options:

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



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服务时,服务名不能有下划线)



服务提供者集群搭建完成

服务消费者实例(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包下建立其他包、类和启动类

  • 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节点



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服务注册中心集成的更多相关文章

  1. 小D课堂 - 新版本微服务springcloud+Docker教程_3-07 Eureka服务注册中心配置控制台问题处理

    笔记 7.Eureka服务注册中心配置控制台问题处理     简介:讲解服务注册中心管理后台,(后续还会细讲) 问题:eureka管理后台出现一串红色字体:是警告,说明有服务上线率低 EMERGENC ...

  2. SpringCloud学习(3)——Eureka服务注册中心及服务发现

    Eureka概述: Eureka是Netflix的一个子模块, 也是核心模块之一.Eureka是一个基于REST的服务, 用于定位服务, 以实现云端中间层服务发现和故障转移.服务注册与发现对于微服务框 ...

  3. SpringCloud IDEA 教学 番外篇 后台运行Eureka服务注册中心

    写在开头 研发过程中经常要做的事就是启动Eureka服务注册中心,每每都要启动一个IDEA,很是困扰.现在分享一个后台启动服务注册中心的方法. 准备工作 1打包一个eureka服务注册中心jar包(注 ...

  4. SpringCloud 进阶之Eureka(服务注册和发现)

    1. Eureka 服务注册与发现 Eureka 是一个基于REST的服务,用于服务的的注册与发现; Eureka采用C-S的设计架构,Eureka Server作为服务注册功能的服务器,它是服务注册 ...

  5. Spring Cloud(二):Eureka 服务注册中心

    前言 服务治理 随着业务的发展,微服务应用也随之增加,这些服务的管理和治理会越来越难,并且集群规模.服务位置.服务命名都会发生变化,手动维护的方式极易发生错误或是命名冲突等问题.而服务治理正是为了解决 ...

  6. SpringCloud学习系列-Eureka服务注册与发现(2)

    构建 microservicecloud-eureka-7001 eureka服务注册中心Module 1.新建microservicecloud-eureka-7001 2.pom <proj ...

  7. Spring Cloud 入门教程(一): Eureka 服务注册

    创建一个Maven工程,New-Other-Maven-Maven Probject 点击Next,红色框里的选上 点击Next 点击Finsh就完成了一个Maven Probject的创建. (1) ...

  8. Eureka服务注册中心

    Eureka服务注册中心 最近在研究Spring Cloud,发现其中的组件实在是太多了,真的是头大,只能一块一块看,像盲人摸象一样.要想很短时间内掌握Spring Cloud是不可能的,小编就学习一 ...

  9. Eureka服务注册中心相关错误com.sun.jersey.api.client.ClientHandlerException: java.net.ConnectException: Connection refused: connect

    启动项目报错如下 原因: 在默认设置下,Eureka服务注册中心也会将自己作为客户端来尝试注册它自己,所以会出现 com.sun.jersey.api.client.ClientHandlerExce ...

随机推荐

  1. 如何重置电信悦 me 智能网关

    如何重置电信悦 me 智能网关 重置电信网关密码 电信悦 me 智能网关密码忘记了怎么办? 首先,得要知道默认终端配置地址和默认终端配置密码. 可以从无线路由器背面标签得知. 如果不知道密码了,可以通 ...

  2. H5 页面与小程序之间 传递数据

    H5 页面与小程序之间 传递数据 小程序里面的 H5页面与小程序之间怎么传递数据 webview与小程序之间的实时通信 webview主动发消息给小程序 webview可以利用jssdk提供的 wx. ...

  3. scrimba & interactive free online tutorials

    scrimba & interactive free online tutorials https://github.com/scrimba/community/blob/master/FAQ ...

  4. NGK以强大的创新能力赋予NGK公链超级实用的特性

    公链从大趋势看是一个不断迭代的过程,不管是共识算法.网络架构.开发者协议都在一代一代不断完善跟创新. NGK公链作为公链赛道上的后起之秀,对于主流公链技术的局限性以及下一代公链技术的发展方向都有非常清 ...

  5. iOS 兼容性处理

    1. scroll滑动层,在iOS中滑动不流畅的处理 -webkit-overflow-scrolling:touch; //在滑动层标签添加这个样式 2. iOS 系统中input标签,去掉圆角效果 ...

  6. SpringBoot 项目初始化

    工作之余,想要学习一下SpringBoot,通过网络大量教程最终成功运行SpringBoot项目.  第一步 首先,通过教程发现一套完整的快速搭建SpringBoot项目网站:https://star ...

  7. MySQL5.7.29 和 Navicat ===> windows窗口式按装和使用

    MySQL windows窗口式按装下载方法:官网: https://www.mysql.com/ ==> DOWNLOADS ==> MySQL Community (GPL) Down ...

  8. 谈一下hashMap中put是如何实现的?

    源码: Hash(key):计算出key的hash值. put方法详解: 1.如果table数组为null或者table数组的长度为0,则调用resize()方法扩容并返回table数组.数组的长度为 ...

  9. 微信小程序:点击预览大图功能

    点击预览大图功能 1. 给轮播图swiper-item绑定点击事件 2. 预览功能的本质是调用了小程序的api:previewImage 微信公众号----文档----开发----API----媒体- ...

  10. 答不上的JUC笔试题

    1:有一个总任务A,分解为子任务A1 A2 A3 ...,任何一个子任务失败后要快速取消所有任务,请写程序模拟. 「请寻求最优解,不要只是粗暴wait()」 本题解题思路:Fork/Join 通常使用 ...