[SpringCloud教程]3. Eureka服务注册中心集成
新微服务项目多半采用Nacos作为服务注册与发现中心,但是旧项目可能使用Eureka、zookeeper、Consul、Nacos作为服务注册中心。
新项目建议使用Nacos作为服务注册中心
- SpringCloud教程合集: https://www.cnblogs.com/spzmmd/tag/微服务教程/
- 案例项目地址: https://gitee.com/spzmmd/spring-cloud-demo
根项目建立
- 建立一个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
IDEA方式启动
启动RegisterServerEureka6001、RegisterServerEureka6002、RegisterServerEureka6003即可,启动后分别访问三个节点的管理端:
如图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
}
集群实现
于服务提供者集群实现方式相似,这里不再赘述
参考
- 使用RestTemplate+负载均衡来调用Eureka服务时,服务名称不能有下划线!!
- Eureka自我保护机制
https://www.cnblogs.com/xishuai/p/spring-cloud-eureka-safe.html
交流&联系
QQ群
欢迎加入Java交流群(qq群号: 776241689 )公众号
PS:小到Java后端技术、计算机基础知识,大到微服务、Service Mesh、大数据等,都是本人研究的方向。我将定期在公众号中分享技术干货,希望以我一己之力,抛砖引玉,帮助朋友们提升技术能力,共同进步!
博客
原创不易,转载请在开头著名文章来源和作者。如果我的文章对您有帮助,请点赞/收藏/关注鼓励支持一下吧
[SpringCloud教程]3. Eureka服务注册中心集成的更多相关文章
- 小D课堂 - 新版本微服务springcloud+Docker教程_3-07 Eureka服务注册中心配置控制台问题处理
笔记 7.Eureka服务注册中心配置控制台问题处理 简介:讲解服务注册中心管理后台,(后续还会细讲) 问题:eureka管理后台出现一串红色字体:是警告,说明有服务上线率低 EMERGENC ...
- SpringCloud学习(3)——Eureka服务注册中心及服务发现
Eureka概述: Eureka是Netflix的一个子模块, 也是核心模块之一.Eureka是一个基于REST的服务, 用于定位服务, 以实现云端中间层服务发现和故障转移.服务注册与发现对于微服务框 ...
- SpringCloud IDEA 教学 番外篇 后台运行Eureka服务注册中心
写在开头 研发过程中经常要做的事就是启动Eureka服务注册中心,每每都要启动一个IDEA,很是困扰.现在分享一个后台启动服务注册中心的方法. 准备工作 1打包一个eureka服务注册中心jar包(注 ...
- SpringCloud 进阶之Eureka(服务注册和发现)
1. Eureka 服务注册与发现 Eureka 是一个基于REST的服务,用于服务的的注册与发现; Eureka采用C-S的设计架构,Eureka Server作为服务注册功能的服务器,它是服务注册 ...
- Spring Cloud(二):Eureka 服务注册中心
前言 服务治理 随着业务的发展,微服务应用也随之增加,这些服务的管理和治理会越来越难,并且集群规模.服务位置.服务命名都会发生变化,手动维护的方式极易发生错误或是命名冲突等问题.而服务治理正是为了解决 ...
- SpringCloud学习系列-Eureka服务注册与发现(2)
构建 microservicecloud-eureka-7001 eureka服务注册中心Module 1.新建microservicecloud-eureka-7001 2.pom <proj ...
- Spring Cloud 入门教程(一): Eureka 服务注册
创建一个Maven工程,New-Other-Maven-Maven Probject 点击Next,红色框里的选上 点击Next 点击Finsh就完成了一个Maven Probject的创建. (1) ...
- Eureka服务注册中心
Eureka服务注册中心 最近在研究Spring Cloud,发现其中的组件实在是太多了,真的是头大,只能一块一块看,像盲人摸象一样.要想很短时间内掌握Spring Cloud是不可能的,小编就学习一 ...
- Eureka服务注册中心相关错误com.sun.jersey.api.client.ClientHandlerException: java.net.ConnectException: Connection refused: connect
启动项目报错如下 原因: 在默认设置下,Eureka服务注册中心也会将自己作为客户端来尝试注册它自己,所以会出现 com.sun.jersey.api.client.ClientHandlerExce ...
随机推荐
- flutter 自定义TabBar
这里有个工作示例 import 'dart:async'; import 'package:flutter/material.dart'; import 'package:rxdart/subject ...
- 翻译:《实用的Python编程》01_06_Files
目录| 上一节(1.5 列表) | 下一节 (1.7 函数) 1.6 文件管理 大多数的程序需要从某处读取输入.本节讨论文件访问. 文件输入和输出 打开一个文件: f = open('foo.txt' ...
- C++算法代码——鹅卵石游戏
题目来自:http://218.5.5.242:9018/JudgeOnline/problem.php?id=2334 题目描述 为了消磨时光,奶牛Bessie和她的朋友Elsie喜欢玩一种她们在农 ...
- Java volatile 关键字底层实现原理解析
本文转载自Java volatile 关键字底层实现原理解析 导语 在Java多线程并发编程中,volatile关键词扮演着重要角色,它是轻量级的synchronized,在多处理器开发中保证了共享变 ...
- 文件描述符(File Descriptor)简介
本文转载自文件描述符(File Descriptor)简介 导语 维基百科:文件描述符在形式上是一个非负整数.实际上,它是一个索引值,指向内核为每一个进程所维护的该进程打开文件的记录表.当程序打开一个 ...
- now-go时间百宝箱
golang不像C#,Java这种高级语言,有丰富的语法糖供开发者很方便的调用.所以这便催生出很多的开源组件,通过使用这些第三方组件能够帮助我们在开发过程中少踩很多的坑. 时间处理是所有语言都要面对的 ...
- 配置JDK环境及其相关问题
1.首先找到JDK的安装目录 如果忘记了安装目录在那个地方,可以通过dos命令java -verbose,进行查看 配置jdk环境 新建系统变量JAVA_HOME: 编辑系统变量Path: 新建系统变 ...
- LayUI之弹出层
1.导入插件 layui使用需要导入layui的js和css: <link rel="stylesheet" href="layui/css/layui.css&q ...
- 后端程序员之路 5、.conf、libconfig
.conf在linux里随处可见,作用基本跟windows的.ini差不多 libconfighttp://www.hyperrealm.com/libconfig/libconfig_manual. ...
- SSRF攻击原理
目录 什么是SSRF 原理 防护 什么是SSRF 一个对外的Web接口,改接口能让用户控制curl命令,去访问别的web服务. 简图如下 想象一下当用户请求的baidu.com/x.php?image ...