SpringCloud微服务:服务注册与发现

编程

Eureka 是Netflix公司开源的服务注册与发现组件。

常见服务注册与发现组件

Zookeeper、Eureka

Eureka服务注册与发现原理

  1. 服务向注册中心进行注册
  2. 获取注册中心其它服务配置

创建Eureka Server

使用Spring Initializr创建项目

创建工程




检查依赖

创建完项目后,检查生成的pom中的版本号

<?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>2.2.2.RELEASE</version>

<relativePath/> <!-- lookup parent from repository -->

</parent>

<groupId>proj.ms</groupId>

<artifactId>registry</artifactId>

<version>1.0.0-SNAPSHOT</version>

<name>registry</name>

<description>registry center</description>

<properties>

<java.version>1.8</java.version>

<spring-cloud.version>Hoxton.RELEASE</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>

<exclusions>

<exclusion>

<groupId>org.junit.vintage</groupId>

<artifactId>junit-vintage-engine</artifactId>

</exclusion>

</exclusions>

</dependency>

</dependencies>

<dependencyManagement>

<dependencies>

<dependency>

<groupId>org.springframework.cloud</groupId>

<artifactId>spring-cloud-dependencies</artifactId>

<version>${spring-cloud.version}</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>

</project>

添加注解

在RegistryApplication类上添加@EnableEurekaServer注解,以启用Eureka的默认配置

package proj.ms.registry;

import org.springframework.boot.SpringApplication;

import org.springframework.boot.autoconfigure.SpringBootApplication;

import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;

@EnableEurekaServer

@SpringBootApplication

public class RegistryApplication {

public static void main(String[] args) {

SpringApplication.run(RegistryApplication.class, args);

}

}

添加配置

修改application.yml文件,添加以下内容:

server:

port: 8761

eureka:

instance:

hostname: localhost

client:

register-with-eureka: false

fetch-registry: false

service-url:

defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/

spring:

application:

name: eureka

启动Eureka Server

点击开发工具右上角的【启动】按钮,启动Eureka Server。访问http://localhost:8761/

Eureka集群

Eureka集群部署架构


微服务在注册时,同时注册至多个Eureka,即使其中某个节点不可用,也不会导致服务注册失败。

Eureka 集群同步原理


Eureka不同节点将自动进行数据同步,以保证集群的高可用。

Eureka 集群配置

修改host文件

在host文件中添加以下内容:

127.0.0.1      peer1

127.0.0.1 peer2

127.0.0.1 peer3

application.yml

---

spring:

profiles: peer1

application:

name: eureka

server:

port: 8761

eureka:

instance:

hostname: peer1

client:

service-url:

defaultZone: http://peer2:8762/eureka/,http://peer3:8763/eureka/

---

spring:

profiles: peer2

application:

name: eureka

server:

port: 8762

eureka:

instance:

hostname: peer2

client:

service-url:

defaultZone: http://peer1:8761/eureka/,http://peer3:8763/eureka/

---

spring:

profiles: peer3

application:

name: eureka

server:

port: 8763

eureka:

instance:

hostname: peer3

client:

service-url:

defaultZone: http://peer1:8761/eureka/,http://peer2:8762/eureka/

Eureka 集群启动

在Idea中,同时配置多个应用,通过启动参数激活不同的配置文件。

同理,配置3个应用,对应不同的profile。

Eureka 集群验证

在浏览器中访问http://peer1:8761/


访问http://peer2:8762/,http://peer3:8763/ 会发现三个Eureka节点已完成互相注册。

打包部署

打包

通过maven命令进行打包:

mvn clean package -Dmaven.test.skip=true

完成打包后,将在项目target目录生成registry-1.0.0-SNAPSHOT.jar和registry-1.0.0-SNAPSHOT.jar.original两个文件。其中registry-1.0.0-SNAPSHOT.jar包含该项目的所有依赖的jar包。

运行

通过以下命令启动Eureka:

java -jar -Dspring.profiles.active=peer1 registry-1.0.0-SNAPSHOT.jar proj.ms.registry.RegistryApplication

同理,通过指定不同的配置文件以启动集群中所有节点。

java -jar -Dspring.profiles.active=peer1 registry-1.0.0-SNAPSHOT.jar proj.ms.registry.RegistryApplication

java -jar -Dspring.profiles.active=peer2 registry-1.0.0-SNAPSHOT.jar proj.ms.registry.RegistryApplication

java -jar -Dspring.profiles.active=peer2 registry-1.0.0-SNAPSHOT.jar proj.ms.registry.RegistryApplication

服务生产者与消费者测试

问题汇总

集群环境启动日志中有ConnectException

com.sun.jersey.api.client.ClientHandlerException: java.net.ConnectException: Connection refused: connect

问题原因:由于集群中不同节点启动顺序不同,启动过程中相互注册时,注册的“Eureka服务”还未完成启动。如peer1在启动时,peer2还未完成启动,此时peer1将自身注册至peer2时,将会出现上述异常。

解决方案:此异常日志的出现是群集中的正常现象,待集群中所有节点完成启动后,将会成功完成互相注册,日志中不再出现上述异常。

集群环境下,节点在unavailable-replicas列表中

问题原因:Eureka默认使用主机名进行注册

解决方案:在eureka.instance.hostname指定的主机名,并通过修改host文件或DNS保证通过该主机名可以找到正确的主机。

以上是 SpringCloud微服务:服务注册与发现 的全部内容, 来源链接: utcz.com/z/511863.html

回到顶部