Products
GG网络技术分享 2026-04-16 22:00 1
说实话,每次看到微服务这三个字,我就头大嗯。真的,头大。但是没办法,现在的技术圈,你不搞微服务,你都不好意思跟人打招呼。SpringCloud Eureka, 作为服务注册与发现的老大哥,虽然现在大家都说Consul好,说Nacos香, 太水了。 但是Eureka它经典啊!它稳啊!就像你那辆开了十年的老捷达,虽然破,但是它能动啊!今天我们就来聊聊,怎么把这个老捷达...哦不怎么把Eureka集群给搭起来。别紧张,真的很简单,也就是那么几个配置文件的事儿。
在开始之前,我们得先明白一个事儿,为什么要集群?你想想,你只有一个注册中心,万一它挂了怎么办?是不是全完了?所有的服务都找不着对象了那不就乱套了吗?所以我们要搞集群,要高可用,要让他们互相同步,互相守望。就像一群大雁,排成队飞,掉了一个,其他的还能接着飞,歇了吧...。

为了显得我们专业一点, 或者说为了让你觉得这文章有点干货,我们先随便看个表格。别问我为什么选这几个,随便凑的,反正都是大家平时听得耳朵起茧子的名字。
| 组件名称 | 主要功能 | 流行程度 | 个人吐槽指数 |
|---|---|---|---|
| Spring Cloud Eureka | 服务注册与发现 | 高 | 4星 |
| Spring Cloud Consul | 服务发现、 配置中心 | 中 | 3星 |
| Spring Cloud Nacos | 注册中心、配置中心 | 极高 | 2星 |
| Zookeeper | 分布式协调服务 | 高 | 5星 |
看完了表格,是不是觉得Eureka其实还行?至少它名字好听。Eureka,这词儿听着就充满了发现新大陆的喜悦。 拜托大家... 好了废话不多说我们开始动手。先说说你得有个SpringBoot项目。没有?去新建一个啊!
不管你干什么先引入jar包。这是Java程序员的宿命。我们在pom.xml里面加上这些玩意儿。注意看,这里有个坑,就是版本号。SpringCloud的版本号和SpringBoot的版本号那是有一段孽缘的,配不对你就等着报错吧。
这里给你贴一段代码,别直接复制,小心报错。你看这里我还特意把jackson给排除了为什么? 换句话说... 主要原因是我任性,我想用gson。当然你完全可以不排除,随你便。
org.springframework.cloud
spring-cloud-starter-netflix-eureka-server
org.springframework.boot
spring-boot-starter-web
com.fasterxml.jackson.core
jackson-databind
org.springframework.cloud
spring-cloud-dependencies
Hoxton.SR9
pom
import
你看这依赖管理,是不是很烦?但是没办法,人家就是这么设计的。SpringCloud通过为Eureka增加SpringBoot风格的自动化配置, 只需要简单的引入依赖和注解配置, 看好你哦! 就能让SpringBoot构建的微服务应用轻松和Eureka服务治理体系整合。这句话是不是听起来特别官方?特别像文档里抄来的?没错,就是这种感觉。
拭目以待。 依赖加完了接下来就是写Java代码了。这步最简单,真的。就两行代码,甚至一行半。你在启动类上加个注解,就完事了。
@EnableEurekaServer
@SpringBootApplication
public class EurekaApplication {
public static void main {
SpringApplication.run;
}
}
看到了吗?`@EnableEurekaServer`,这就是那个神奇的注解。加上它,你的项目就变成了一个Eureka Server,一个注册中心。是不是有一种变身超人的感觉?虽然现在它还跑不起来主要原因是我们还没配置文件,嗐...。
好了重头戏来了。配置文件。我们要搭建集群,至少得有两个节点吧?我们就搞两个,一个叫8881,一个叫8882。为什么是这两个端口?主要原因是吉利?不是主要原因是随便选的。
我们先来配置第一个节点,端口8881。创建一个`application-peer1.properties`。名字随便起,开心就好,太水了。。
server.port=8881
spring.application.name=eureka-server
## eureka服务端:禁用自己的客户端注册行为
eureka.instance.hostname=localhost
# 服务端禁用自己的客户端注册行为
eureka.client.register-with-eureka=false
# 服务端只需要维护服务实例, 不需要检索服务
eureka.client.fetch-registry=false
# 服务端设置自己的.properties属性值
eureka.client.service-url.defaultZone=localhost:8882/eureka/
我狂喜。 注意看再说说一行,`defaultZone`。这里填的是另一个节点的地址。这就是集群的关键!它们得互相认识,互相注册。就像相亲一样,你得把对方的情况先报上去。
实不相瞒... 然后是第二个节点,端口8882。创建一个`application-peer2.properties`。
server.port=8882
spring.application.name=eureka-server
## eureka服务端:禁用自己的客户端注册行为
eureka.instance.hostname=localhost
# 服务端禁用自己的客户端注册行为
eureka.client.register-with-eureka=false
# 服务端只需要维护服务实例,不需要检索服务
eureka.client.fetch-registry=false
# 服务端设置自己的.properties属性值
eureka.client.service-url.defaultZone=localhost:8881/eureka/
看出来了吗?再说说一行变了它指向了8881。这就是所谓的“互相注册,形成一组集群,以实现服务清单的互相同步, 不错。 达到高可用效果”。这句话太长了我打字都累。 你指向我,我指向你,我们就是好基友。
说到配置, 我就想起了以前做Mybatis链路分析的时候,那叫一个头疼。JDK动态代理和责任链模式的应用,简直是面试必问。但是你真的用到了吗?也就是看看源码的时候装装逼。还有那个SQL治理经验谈:索引覆盖,听起来多高大上。不就是加个索引嘛!搞得那么复杂。还有那个亿级大表垂直拆分的工程实践,哎哟,亿级大表,听着就吓人。我们这种小公司,有个百万级表就烧高香了。还有那个亿级大表冷热分级的工程实践,冷热分级,不就是把不用的数据扔到别的地方去吗?至于还要搞个工程实践吗,躺平...?
哦对了最近那个大模型安装部署、测试、接入SpringCloud应用体系也很火。我也想搞个AI进去,让它帮我写代码。但是想想,万一它写出来的代码比我写的还烂怎么办?那我不是更没面子了?还有那个基于SpringMVC的API灰度方案,灰度发布,听着就高级。我们现在的发布方式就是“直接上,挂了再回滚”,简单粗暴,欧了!。
你看啊... 还有那个微服务重构:Mysql+DTS+Kafka+ElasticSearch解决跨表检索难题。这一套组合拳下来估计头发都掉光了。跨表检索难题,用ES不就完了吗?为什么要扯上Kafka和DTS?为了显得架构复杂吗?为了显得技术栈深不可测吗?我不懂,我真的不懂。
啊这... 配置好了代码写好了接下来就是启动了。怎么启动?你总不能在IDEA里跑两个Main方法吧?虽然也可以但是我们要专业一点。打包!打成jar包!
打包命令我就不写了反正就是`mvn clean package`。打完包之后你会得到一个jar包,比如叫`eureka-1.0-SNAPSHOT.jar`,切中要害。。
然后我们打开命令行,开始装逼了。
启动第一个节点:
java -jar eureka-1.0-SNAPSHOT.jar --spring.profiles.active=peer1
java -jar eureka-1.0-SNAPSHOT.jar --spring.profiles.active=peer2
看到了吗?`--spring.profiles.active`这个参数就是用来指定我们刚才写的那个配置文件的。peer1对应8881,peer2对应8882。是不是很机智,翻旧账。?
等它们启动起来你就可以在浏览器里输入`localhost:8881`或者`localhost:8882`去看看了。你会看到那个熟悉的粉色界面。 这事儿我得说道说道。 在DS Replicas那一栏,你应该能看到另一个节点的名字。这就说明,它们成功了!它们牵手了!
在Spring Cloud Eureka中,DS Replicas是指Eureka Server集群中各个节点之间同步注册表信息的副本。这句话是抄定义的,但是你得理解,就是大家信息共享。你有的服务我也有,我有的服务你也有。
为了凑字数...哦不为了丰富文章内容,我们再来看一个表格。这个表格是关于注册中心选型的,虽然我们已经选了Eureka,但是看看无妨。
| 特性 | Eureka | Consul | Zookeeper |
|---|---|---|---|
| 一致性协议 | AP | CP | CP |
| 访问接口 | HTTP | HTTP/DNS | TCP |
| 健康检查 | 支持 | 支持 | 支持 |
| 负载均衡 | Ribbon | Fabio | 需要自己实现 |
看到AP和CP了吗?这是分布式系统的铁律。你要么要性能,要么要一致性。Eureka选择了AP, 主要原因是它觉得,网络分区是常有的事,服务挂了也是常有的事,只要大家再说说能同步上就行。这就是它的设计哲学,换个思路。。
好了说了这么多,其实搭建Eureka集群真的就那么几步。加依赖,写注解,配文件,启动。搞定。是不是很简单?但是简单归简单,里面的坑还是不少的。比如那个`register-with-eureka`和`fetch-registry`, 完善一下。 如果你不设为false,Server自己也会去注册,然后就会报错,说找不到自己。这就很尴尬了。
我破防了。 分布式环境下考虑发生故障的情况,要构建高可用的注册中心,以增强系统的可用性。这句话是真理。一定要记住单点故障是万恶之源。能集群就集群,能备份就备份。
各个微服务实例的注册与发现,是微服务架构的基石。没有注册中心,微服务就是一盘散沙。Eureka虽然老了但是还能打。对于中小型项目完全够用了。别整天追求最新的技术,适合自己的才是最好的,无语了...。
白嫖。 再说说希望大家都能顺利搭建出自己的Eureka集群。如果遇到问题,别问我,我也解决不了。去Stack Overflow上搜吧,那里才是归宿。或者,你可以试试把电脑关了再开,说不定就好了呢?
Demand feedback