文章目录
上篇文章 使用Alibaba Nacos体验第一个Spring Cloud微服务应用
本文将在上文的基础上,演示将Nacos注册中心切换到Eureka注册中心
Eureka注册中心介绍
搬运 @稀土掘金技术社区 的一张图,网上翻了翻画的基本都是这个模型
使用Eureka有三点缺点不推荐使用
- 在2019年巴塞罗那Spring I/O 大会和奥斯汀Spring One Platform大会上,Spring 团队有一个主题为“How to live in a post Spring Cloud Netflix world”的环节来讲解Spring Cloud Netflix进入维护模式后使用其他Spring Cloud实现代替Netflix的解决方案。
- Eureka 2.0 已经停止开发,1.x的架构存在问题,比如,客户端采用pull模式拉取服务数据时,导致实时性不足和无谓的拉取性能小号的问题;Eureka 集群的每一个实例都可以接受客户端的写请求,并且各个实例会进行数据复制,从而导致一些性能问题。
- 其他注册中心如Alibaba Nacos、HaShicorp Consul的社区一直在维护,差距会越来越大
Eureka集群的原理这里引用一篇其他博主的文章,本文不再多加讲解
https://blog.csdn.net/YYniannian/article/details/125678434
创建启动Eureka注册中心
创建Eureka注册中心
我们通过idea 新建一个Eureka Server项目
注意下图最上方的Server URL,默认的start.spring.io因为是外网,经常连接超时,我改成了https://start.aliyun.com
点击下一步,通过搜索功能添加Eureka Server,点击Finish
社区版idea不支持这个功能,这里我直接把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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.wpx</groupId>
<artifactId>EurekaServer</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>EurekaServer</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<spring-boot.version>2.3.7.RELEASE</spring-boot.version>
<spring-cloud.version>Hoxton.SR9</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>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring-boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.3.7.RELEASE</version>
<configuration>
<mainClass>com.wpx.eurekaserver.EurekaServerApplication</mainClass>
</configuration>
<executions>
<execution>
<id>repackage</id>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
编辑启动类,这里我直接贴代码,社区办的idea生成的项目可能不包含启动类,我把项目结构也贴出来
EurekaServerApplication
package com.wpx.eurekaserver;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
@EnableEurekaServer // 使用@EnableEurekaServer 注解开启Eureka Server
@SpringBootApplication
public class EurekaServerApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaServerApplication.class, args);
}
}
application.properties
# 应用名称
spring.application.name=EurekaServer
# 应用端口
server.port=8082
# 不想注册中心注册实例,因为该实例本身就是注册中心
eureka.client.register-with-eureka=false
# 不从Eureka Server 中获取实例信息
eureka.client.fetch-registry=false
项目结构
启动Eureka注册中心
在文件EurekaServerApplication上右键 Run 'EurekaServerApplication’启动服务,控制台打印以下内容即为启动成功
访问Eureka控制台 http://localhost:8082/
可以看到左下角红框选中的地方,并没有有效实例注册到注册中心,因为我们前面在配置文件中配置了eureka.client.register-with-eureka=false,所以这里不会展示我们启动的这个Eureka Server,当然如果我们想把自身注册上去,也是需要其他配置信息的,会在下面讲出来。
将Nacos服务提供者Provider注册中心改为Eureka
上一批文章中的NacosProvider服务,没看的同学可以大概看一眼。
我们将原本的pom.xml做一下修改
移除项
<properties>
<spring-cloud-alibaba.version>2.2.2.RELEASE</spring-cloud-alibaba.version>
</properties>
<dependencies>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>${spring-cloud-alibaba.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
新增项
<properties>
<spring-cloud.version>Hoxton.SR9</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</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>
我们再将原本的application.properties做一下修改
修改前
# 应用名称
spring.application.name=NacosProvider
# Nacos 服务发现与注册配置,其中子属性 server-addr 指定 Nacos 服务器主机和端口
spring.cloud.nacos.discovery.server-addr=localhost:8848
# 注册到 nacos 的指定 namespace,默认为 public
spring.cloud.nacos.discovery.namespace=public
# 应用服务 WEB 访问端口
server.port=8080
修改后
# 应用名称
spring.application.name=NacosProvider
# 应用服务 WEB 访问端口
server.port=8080
# Eureka Server 地址信息 Eureka Server 的访问地址拼接 /eureka
eureka.client.service-url.defaultZone=http://localhost:8082/eureka
启动NacosProvider服务提供者
启动成功,显示注册到了Eureka Server,状态UP,响应码 204
我们来看一下Eureka的控制台有什么变化
有效服务注册列表多了一个NACOSPROVIDER,就是我们在服务提供者配置文件写的spring.application.name=NacosProvider,后面有服务信息
将Nacos服务消费者Consumer注册中心改为Eureka
改造内容跟改造服务提供者Provider一摸一样,启动后访问Eureka控制台
跟刚才一模一样,服务消费者并没有注册上来,因为我们在上一章创建服务消费者的时候,在启动类的的注册注解上加了一个属性
@EnableDiscoveryClient(autoRegister = false) // 设置不自动注册到注册中心Nacos,因为这个项目本身是消费者,不向外暴露服务
这个注解在Eureka上同样适用,服务启动并不会注册到Eureka Server
通过服务消费者Consumer调用服务提供者Provider
启动NacosConsumer后访问 http://127.0.0.1:8081/hello 返回内容如下
echo:nacos
访问 http://127.0.0.1:8081/info 返回内容如下
all service:[NacosProvider]
NacosConsumer instance list:
[ serviceId: NacosProvider, host: 172.16.86.2, port: 8080 ]
可以看出结果跟上一篇适用Nacos注册中心是一模一样的。
总结
对比使用Nacos的Provider和使用Eureka的Provider,以及使用Nacos的Consumer和使用Eureka的Consumer,可以发现它们的代码没有任何差异,亮着唯一的区别在于pom依赖和配置内容上,如下图表示
服务注册/发现组件 | maven依赖 | 配置项与配置值 |
---|---|---|
Alibab Nacos | spring-cloud-starter-alibaba-nacos-discovery | spring.cloud.nacos.discovery.server-addr=localhost:8848 |
Netflix Eureka | spring-cloud-starter-netflix-eureka-client | eureka.client.service-url.defaultZone=http://localhost:8082/eureka |
github 链接
Eureka分支
Eureka Server 注册中心
https://github.com/wangpengxiang1996/EurekaServer
provide 服务提供者
https://github.com/wangpengxiang1996/NacosProvider
consumer 服务消费者
https://github.com/wangpengxiang1996/NacosConsumer
本文结束