使用Netflix Eureka替换Alibaba Nacos注册中心

大数据43

文章目录

上篇文章 使用Alibaba Nacos体验第一个Spring Cloud微服务应用

本文将在上文的基础上,演示将Nacos注册中心切换到Eureka注册中心

Eureka注册中心介绍

搬运 @稀土掘金技术社区 的一张图,网上翻了翻画的基本都是这个模型
使用Netflix Eureka替换Alibaba Nacos注册中心
使用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
使用Netflix Eureka替换Alibaba Nacos注册中心
点击下一步,通过搜索功能添加Eureka Server,点击Finish
使用Netflix Eureka替换Alibaba Nacos注册中心
社区版idea不支持这个功能,这里我直接把pom.xml贴出来


<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.0modelVersion>
    <groupId>com.wpxgroupId>
    <artifactId>EurekaServerartifactId>
    <version>0.0.1-SNAPSHOTversion>
    <name>EurekaServername>
    <description>Demo project for Spring Bootdescription>

    <properties>
        <java.version>1.8java.version>
        <project.build.sourceEncoding>UTF-8project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8project.reporting.outputEncoding>
        <spring-boot.version>2.3.7.RELEASEspring-boot.version>
        <spring-cloud.version>Hoxton.SR9spring-cloud.version>
    properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.cloudgroupId>
            <artifactId>spring-cloud-starter-netflix-eureka-serverartifactId>
        dependency>

        <dependency>
            <groupId>org.springframework.bootgroupId>
            <artifactId>spring-boot-starter-testartifactId>
            <scope>testscope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintagegroupId>
                    <artifactId>junit-vintage-engineartifactId>
                exclusion>
            exclusions>
        dependency>
    dependencies>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloudgroupId>
                <artifactId>spring-cloud-dependenciesartifactId>
                <version>${spring-cloud.version}version>
                <type>pomtype>
                <scope>importscope>
            dependency>
            <dependency>
                <groupId>org.springframework.bootgroupId>
                <artifactId>spring-boot-dependenciesartifactId>
                <version>${spring-boot.version}version>
                <type>pomtype>
                <scope>importscope>
            dependency>
        dependencies>
    dependencyManagement>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.pluginsgroupId>
                <artifactId>maven-compiler-pluginartifactId>
                <version>3.8.1version>
                <configuration>
                    <source>1.8source>
                    <target>1.8target>
                    <encoding>UTF-8encoding>
                configuration>
            plugin>
            <plugin>
                <groupId>org.springframework.bootgroupId>
                <artifactId>spring-boot-maven-pluginartifactId>
                <version>2.3.7.RELEASEversion>
                <configuration>
                    <mainClass>com.wpx.eurekaserver.EurekaServerApplicationmainClass>
                configuration>
                <executions>
                    <execution>
                        <id>repackageid>
                        <goals>
                            <goal>repackagegoal>
                        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
@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

项目结构
使用Netflix Eureka替换Alibaba Nacos注册中心

启动Eureka注册中心

在文件EurekaServerApplication上右键 Run 'EurekaServerApplication'启动服务,控制台打印以下内容即为启动成功
使用Netflix Eureka替换Alibaba Nacos注册中心
访问Eureka控制台 http://localhost:8082/
使用Netflix Eureka替换Alibaba Nacos注册中心
可以看到左下角红框选中的地方,并没有有效实例注册到注册中心,因为我们前面在配置文件中配置了eureka.client.register-with-eureka=false,所以这里不会展示我们启动的这个Eureka Server,当然如果我们想把自身注册上去,也是需要其他配置信息的,会在下面讲出来。

; 将Nacos服务提供者Provider注册中心改为Eureka

上一批文章中的NacosProvider服务,没看的同学可以大概看一眼。
我们将原本的pom.xml做一下修改
移除项

    <properties>
        <spring-cloud-alibaba.version>2.2.2.RELEASEspring-cloud-alibaba.version>
    properties>

    <dependencies>
        <dependency>
            <groupId>com.alibaba.cloudgroupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discoveryartifactId>
        dependency>
    dependencies>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>com.alibaba.cloudgroupId>
                <artifactId>spring-cloud-alibaba-dependenciesartifactId>
                <version>${spring-cloud-alibaba.version}version>
                <type>pomtype>
                <scope>importscope>
            dependency>
        dependencies>
    dependencyManagement>

新增项

    <properties>
        <spring-cloud.version>Hoxton.SR9spring-cloud.version>
    properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.cloudgroupId>
            <artifactId>spring-cloud-starter-netflix-eureka-clientartifactId>
        dependency>
    dependencies>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloudgroupId>
                <artifactId>spring-cloud-dependenciesartifactId>
                <version>${spring-cloud.version}version>
                <type>pomtype>
                <scope>importscope>
            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服务提供者
使用Netflix Eureka替换Alibaba Nacos注册中心
启动成功,显示注册到了Eureka Server,状态UP,响应码 204
我们来看一下Eureka的控制台有什么变化
使用Netflix Eureka替换Alibaba Nacos注册中心
有效服务注册列表多了一个NACOSPROVIDER,就是我们在服务提供者配置文件写的spring.application.name=NacosProvider,后面有服务信息

将Nacos服务消费者Consumer注册中心改为Eureka

改造内容跟改造服务提供者Provider一摸一样,启动后访问Eureka控制台使用Netflix Eureka替换Alibaba Nacos注册中心
跟刚才一模一样,服务消费者并没有注册上来,因为我们在上一章创建服务消费者的时候,在启动类的的注册注解上加了一个属性

@EnableDiscoveryClient(autoRegister = false)

这个注解在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 Nacosspring-cloud-starter-alibaba-nacos-discoveryspring.cloud.nacos.discovery.server-addr=localhost:8848Netflix Eurekaspring-cloud-starter-netflix-eureka-clienteureka.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

本文结束

Original: https://blog.csdn.net/qq_38496932/article/details/126958855
Author: 鹏鹏王
Title: 使用Netflix Eureka替换Alibaba Nacos注册中心