SpringCloud入门实战之十:高可用的服务注册中心

本系列第一篇介绍了服务注册与发现,其中服务注册中心Eureka Server,是一个实例,当成千上万个服务向它注册的时候,它的负载是非常高的,
这在生产环境上是不太合适的,这篇文章主要介绍怎么将Eureka Server集群化。

Eureka通过运行多个实例,使其更具有高可用性,事实上这是它默认的熟性,你需要做的就是给对等的实例一个合法的关联serviceurl。

这篇文章我们基于第一篇文章的源码 https://download.csdn.net/download/zhengzizhi/10551824 工程来做修改。
我们将/opt/coding目录下的工程源码全部删掉,当然你也可以不这么干,重新换一个保存工程源码的目录,本范例还是删掉全部工程源码
[root@contoso coding]# pwd
/opt/coding
[root@contoso coding]# ls
config-client  config-server  eureka-server  service-hi  service-miya  spring-cloud-example9.zip
[root@contoso coding]# rm -rf ./*
[root@contoso coding]#
[root@contoso coding]# rz
rz waiting to receive.
Starting zmodem transfer.  Press Ctrl+C to cancel.
Transferring spring-cloud-example1.zip...
  100%     114 KB     114 KB/sec    00:00:01       0 Errors 

[root@contoso coding]# ls
spring-cloud-example1.zip
不管你使用何种方式下载spring-cloud-example1.zip范例源码,都必须保存在/opt/coding目录下解压,
因为我想直接用STS开发工具打开项目进行修改继续改造

[root@contoso coding]# unzip spring-cloud-example1.zip
[root@contoso coding]# ls
eureka-server  service-hi  spring-cloud-example1.zip
[root@contoso coding]# rm -f spring-cloud-example1.zip

File ---> Open Projects from File System... ---> Import source:
/opt/coding  最后点击Finish按钮完成工程源码的导入操作

第一部分:改造eureka-server工程

在eureka-server工程中重新定义文件application.yml配置:

---
spring:
   profiles: peer1
server:
   port: 8761
eureka:
   instance:
      hostname: peer1
   client:
      serviceUrl:
         defaultZone: http://peer2:8769/eureka/

---
spring:
   profiles: peer2
server:
   port: 8769
eureka:
   instance:
      hostname: peer2
   client:
      serviceUrl:
        defaultZone: http://peer1:8761/eureka/

这样eureka-server工程就改造完毕啦。

给不存在的主机peer1和peer2建立到自己IP地址之间的映射关系,使用追加文件内容的方式1条命令搞定这种映射关系,

命令如下:
cat >> /etc/hosts
127.0.0.1  peer1
127.0.0.1  peer2

按组合键Ctrl+D退出写文件操作

[root@contoso ~]# cat /etc/hosts
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4 contoso contoso.com
192.168.10.13 contoso contoso.com
127.0.0.1  peer1
127.0.0.1  peer2
[root@contoso ~]# 

第二部分:改造service-hi工程

重新定义本工程的application.yml的配置内容:

server:
  port: 8762

spring:
  application:
    name: service-hi

eureka:
  client:
    serviceUrl:
      defaultZone: http://peer1:8761/eureka/

启动工程

启动2个eureka-server注册中心,组成一个群集,它们之间互为服务器客户端

cd /opt/coding/eureka-server/target && java -jar eureka-server-0.0.1-SNAPSHOT.jar --spring.profiles.active=peer1
cd /opt/coding/eureka-server/target && java -jar eureka-server-0.0.1-SNAPSHOT.jar --spring.profiles.active=peer2

可能你会看到:

It seems to be a socket read timeout exception, it will retry later. if it continues to happen and some eureka node
occupied all the cpu time, you should set property 'eureka.server.peer-node-read-timeout-ms' to a bigger value

启动service-hi:

访问:localhost:8761 和 localhost:8769 如图:

你会发现注册了service-hi,并且有个peer2节点,同理访问localhost:8769你会发现有个peer1节点,
client只向8761注册,但是当你打开8769,你也会发现8769也有client的注册信息。

eureka.instance.preferIpAddress=true是通过设置ip让eureka让其他服务注册它,也许能通过去改变去通过改变host的方式。

此时的架构图:

Eureka-eserver peer1 8761,Eureka-eserver peer2 8769相互感应,当有服务注册时,两个Eureka-eserver是对等的,它们都存有相同的信息,这就是通过服务器的冗余来增加可靠性,当有一台服 务器宕机了,服务并不会终止,因为另一台服务存有相同的数据。

本篇blog源码 spring-cloud-example10.zip

补充非常重要的内容,编译本范例过程中eureka-server工程时一定会报告编译测试错误,使用如下方式跳过单元测试:

	<properties>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
		<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
		<java.version>1.8</java.version>
		<spring-cloud.version>Finchley.RELEASE</spring-cloud.version>
		<!-- maven方式跳过maven test, 等同$ mvn package -Dmaven.test.skip=true -->
		<!-- <maven.test.skip>true</maven.test.skip> -->
		<!-- surefire plugin方式跳过maven test, 等同$ mvn package -DskipTests -->
		<skipTests>true</skipTests>
	</properties>

猜你喜欢

转载自blog.csdn.net/zhengzizhi/article/details/81154389