• springcloud gateway获取请求服务名_服务器




注册中心Eureka Server





springcloud gateway获取请求服务名_Server_02


新建项目


使用 @EnableEurekaServer


springcloud gateway获取请求服务名_大数据_03


就可以让应用变为Eureka服务器,这是因为spring boot封装了Eureka Server,让你可以嵌入到应用中直接使用

直接运行成功如下


springcloud gateway获取请求服务名_Server_04


但是不断报异常,why?


springcloud gateway获取请求服务名_Cloud_05


这是因为该应用虽然是 Server 端,但也同时是 Client 端,也需要一个注册中心将自己注册进去

为消除其异常,修改下配置

配置需要注册的地址,也就是往自己身上注册


springcloud gateway获取请求服务名_Server_06


通过观察源码,知道其实是一个 map, 所以配置如下


springcloud gateway获取请求服务名_大数据_07


启动仍旧报错,其实正常问题,因为服务端自己又是 Server, 又是 Client, 服务端未启动完成时,客户端肯定是无法找到服务端的

但是 eureka 的服务端/客户端采用心跳通信方式


springcloud gateway获取请求服务名_Cloud_08


可看到地址已随配置被改变

接下来配置实例名



springcloud gateway获取请求服务名_服务器_09



springcloud gateway获取请求服务名_大数据_10


实例名被修改成功


但是该应用本身就是个注册中心,不需要将其显示在注册实例中,通过以下配置



springcloud gateway获取请求服务名_Cloud_11


为防止冲突,将端口号回改为默认


springcloud gateway获取请求服务名_大数据_12



springcloud gateway获取请求服务名_Cloud_13


服务中心


springcloud gateway获取请求服务名_Cloud_14


为避免每次手动启动,将应用打成 war 包(jar)



springcloud gateway获取请求服务名_大数据_15



springcloud gateway获取请求服务名_Server_16


通过 java 命令启动



springcloud gateway获取请求服务名_Cloud_17


启动成功效果



springcloud gateway获取请求服务名_大数据_18


Mac 下 Ctrl+C 退出服务



springcloud gateway获取请求服务名_Cloud_19


后台执行



springcloud gateway获取请求服务名_Cloud_20


查看其相关进程信息


如此该应用就方便了我们,不需要每次都去手动启动应用,在后台会重启,若想杀死进程直接 kill



springcloud gateway获取请求服务名_大数据_21


3.3 Eureka Client的使用


springcloud gateway获取请求服务名_Cloud_22


默认情况下,DiscoveryClient的实现将使用远程发现服务器自动注册本地Spring Boot服务器。可以通过在@EnableDiscoveryClient中设置autoRegister=false来禁用此功能。

启动Server, 再启动 Client



springcloud gateway获取请求服务名_服务器_23


发现并没有注册成功实例


因为没有配置注册目标地址信息



springcloud gateway获取请求服务名_Cloud_24


之后再次重启,依旧无法注册成功,几经勘察,添加以下依赖后,成功运行,注册到服务器


springcloud gateway获取请求服务名_Server_25


再指定 client 名字



springcloud gateway获取请求服务名_Server_26


发现成功注册


springcloud gateway获取请求服务名_大数据_27


此为 client 应用ip 地址


springcloud gateway获取请求服务名_大数据_28


但其实可以自定义


springcloud gateway获取请求服务名_服务器_29


接着点击进入那个链接,URL如下


springcloud gateway获取请求服务名_Cloud_30


  • Eureka保证AP
    有时会发现如下红色警戒!


  • springcloud gateway获取请求服务名_大数据_31



  • Eureka看明白了这一点,因此在设计时就优先保证可用性。我们可以容忍注册中心返回的是几分钟以前的注册信息,但不能接受服务直接down掉不可用。也就是说,服务注册功能对可用性的要求要高于一致性。
    如果Eureka服务节点在短时间里丢失了大量的心跳连接(注:可能发生了网络故障),那么这个 Eureka节点会进入“自我保护模式”,同时保留那些“心跳死亡”的服务注册信息不过期。此时,这个Eureka节点对于新的服务还能提供注册服务,对于“死亡”的仍然保留,以防还有客户端向其发起请求。当网络故障恢复后,这个Eureka节点会退出“自我保护模式”。Eureka的哲学是,同时保留“好数据”与“坏数据”总比丢掉任何数据要更好。
    在开发模式,最好关闭该模式(默认是开启的),仅能在开发环境关闭!,生产环境禁止关闭!!!


  • springcloud gateway获取请求服务名_java_32


3.4 Eureka的高可用

如果一台 eureka宕机了咋办呢,为了实现高可用,如果直接加一台服务器并无任何卵用,考虑将两台 eureka 互相注册



springcloud gateway获取请求服务名_java_33


复制得到两份 eureka,并以端口区分



springcloud gateway获取请求服务名_大数据_34


将 eureka1注册到 eureka2上并启动


springcloud gateway获取请求服务名_Server_35


将 eureka2注册到 eureka1上并启动



springcloud gateway获取请求服务名_大数据_36



springcloud gateway获取请求服务名_java_37



springcloud gateway获取请求服务名_服务器_38


发现 client 在1,2同时都注册成功了!

假如此时 eureka1宕机了,会发生什么呢?


springcloud gateway获取请求服务名_Cloud_39


我们来将1给关闭


springcloud gateway获取请求服务名_Cloud_40



springcloud gateway获取请求服务名_Server_41



springcloud gateway获取请求服务名_Server_42


发现2依旧存活,并且 client 还在连接

若此时再 client 端重启又会发生什么呢?



springcloud gateway获取请求服务名_Server_43


因为无法注册,自然报错了,E2上也没有 client 端再连接了



springcloud gateway获取请求服务名_Server_44


那么问题来了,怎么才能保证 E1宕机后, client 仍能注册在 E2上呢?只要保持每次都同时往两个 E 注册


springcloud gateway获取请求服务名_Cloud_45


同理可得,当有3个 E 时,如此相互注册



springcloud gateway获取请求服务名_java_46



springcloud gateway获取请求服务名_java_47



springcloud gateway获取请求服务名_Server_48


新建 E3


springcloud gateway获取请求服务名_Cloud_49



springcloud gateway获取请求服务名_Server_50



springcloud gateway获取请求服务名_Server_51


对于我们的开发环境,部署一个 E 即可,不再集群

3.5 Eureka总结


springcloud gateway获取请求服务名_java_52


3.6 分布式下服务注册的地位和原理


springcloud gateway获取请求服务名_Server_53



springcloud gateway获取请求服务名_服务器_54


A 类比青楼中的嫖客, B 类比青楼女子,注册中心呢就相当于青楼中的妈咪
一般 嫖客服务一来,就肯定直接点名春花还是秋月呀,直接问妈咪要花魁就行



springcloud gateway获取请求服务名_Server_55



springcloud gateway获取请求服务名_java_56