熟悉微服务架构或Dubbo框架的都知道,微服务中最核心、最基础的组件就是注册中心了。下面利用Spring Cloud Eureka实现服务注册中心。并注册一个简单的服务提供者。
首先先创建一个spirngboot工程,并在父pom文件中添加公用依赖。
如下:
org.springframework.cloud
spring-cloud-dependencies
Finchley.M2
pom
import
org.springframework.cloud
spring-cloud-starter-netflix-eureka-server
如下:
@SpringBootApplication
@EnableEurekaServer
public class EurekaApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaApplication.class, args);
}
}
eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka/
#是否开启注册服务,因为这里如果为true表示自己注册自己,而自己就是一个服务注册方,没必要自己注册自己
register-with-eureka: false
#是否拉取服务列表,这里我只提供服务给别的服务。
fetch-registry: false
server:
#是否开启安全保护,默认是开启的,如果默认开启,注册中心的服务列表就算有些服务断开了,也会继续保存
enable-self-preservation: false
spring:
application:
#Eureka实例名,集群中根据这里相互识别
name: eureka
server:
port: 8761
然后启动springboot工程,从浏览器访问http://localhost:8761/,可以看到如下界面,因为还没有注册服务,所以应用列表是空的
因为enable-self-preservation: false,图上的红字是不会有的
到这里,注册中心就搭建好了。接下来我们就创建两个服务提供者,注册到注册中心。
新建applicationA,applicationB两个子模块,用作服务提供者。
两个服务提供者的pom.xml都是一样的,如下:
org.springframework.boot
spring-boot-starter
org.springframework.cloud
spring-cloud-starter-netflix-eureka-client
org.springframework.boot
spring-boot-starter-test
test
org.springframework.boot
spring-boot-starter-web
修改两个application.yml文件,下图:
#端口号
server:
port: 8081
#Eureka实例名,集群中根据这里相互识别
spring:
application:
name: B-service
eureka:
#客户端
client:
#注册中心地址
service-url:
defaultZone: http://localhost:8761/eureka/
两个分别在启动类上加如下@EnableDiscoveryClient注解,如下所示:
@SpringBootApplication
@EnableDiscoveryClient
public class Demo2Application {
public static void main(String[] args) {
SpringApplication.run(Demo2Application.class, args);
}
}
然后分别启动这两个服务,如下图所示:
在服务治理框架中,通常都会构建一个注册中心,每个服务单元向注册中心登记自己提供的服务,包括服务的主机与端口号、服务版本号、通讯协议等一些附加信息。注册中心按照服务名分类组织服务清单,
同时还需要以心跳检测的方式去监测清单中的服务是否可用,若不可用需要从服务清单中剔除,以达到排除故障服务的效果。
在实际的项目中,单机往往是不够的,而需要注册中心集群,实现注册中心的高可用。如下图所示:
在服务治理框架中,通常都会构建一个注册中心,每个服务单元向注册中心登记自己提供的服务,包括服务的主机与端口号、服务版本号、通讯协议等一些附加信息。注册中心按照服务名分类组织服务清单,同时还需要以心跳检测的方式去监测清单中的服务是否可用,若不可用需要从服务清单中剔除,以达到排除故障服务的效果。
在服务治理框架下,服务间的调用不再通过指定具体的实例地址来实现,而是通过服务名发起请求调用实现。服务调用方通过服务名从服务注册中心的服务清单中获取服务实例的列表清单,通过指定的负载均衡策略取出一个服务实例位置来进行服务调用。
Eureka服务端,即服务注册中心。它同其他服务注册中心一样,支持高可用配置。依托于强一致性提供良好的服务实例可用性,可以应对多种不同的故障场景。
Eureka服务端支持集群模式部署,当集群中有分片发生故障的时候,Eureka会自动转入自我保护模式。它允许在分片发生故障的时候继续提供服务的发现和注册,当故障分配恢复时,集群中的其他分片会把他们的状态再次同步回来。集群中的的不同服务注册中心通过异步模式互相复制各自的状态,这也意味着在给定的时间点每个实例关于所有服务的状态可能存在不一致的现象。
Eureka客户端,途中的即服务提供者,主要处理服务的注册和发现。客户端服务通过注册和参数配置的方式,嵌入在客户端应用程序的代码中。在应用程序启动时,Eureka客户端向服务注册中心注册自身提供的服务,并周期性的发送心跳来更新它的服务租约。同时,他也能从服务端查询当前注册的服务信息并把它们缓存到本地并周期行的刷新服务状态。
这里给读者解释一下什么是注册,什么是续约,什么是下线,什么是Relicate
注册中心按照服务名分类组织服务清单,同时还需要以心跳检测的方式去监测清单中的服务是否可用,若不可用需要从服务清单中剔除,以达到排除故障服务的效果。
续约,这里类似于心跳检测机制,默认是每隔90秒,服务提供者需要向注册中心进行续约,目的是隔一段时间Service Provider调用接口,告诉Eureka Server它还活着没挂,不要把它T了。通俗的说就是它们两之间的心跳检测,避免服务提供者被剔除掉
下线,表示服务提供者断开
接下来模拟注册中心的集群形式,首先设置三个eureka的端口
比如:6010,6011,6012
接下来修改一下DEMO2-SERVICE的yml文件:
#端口号
server:
port: 8081
#Eureka实例名,集群中根据这里相互识别
spring:
application:
name: demo2-service
eureka:
#客户端
client:
#注册中心地址
service-url:
defaultZone: http://localhost:6010/eureka/,http://localhost:6011/eureka/,http://localhost:6012/eureka/
将原来的eureka服务在复制两份,修改过后分别启动,修改结果:
Eureka1,端口6010
yml文件:
eureka:
client:
service-url:
defaultZone: http://localhost:6011/eureka/,http://localhost:6012/eureka/
#是否开启注册服务,因为这里如果为true表示自己注册自己,而自己就是一个服务注册方,没必要自己注册自己
register-with-eureka: false
#是否拉取服务列表,这里我只提供服务给别的服务。
fetch-registry: false
server:
#是否开启安全保护,默认是开启的,如果默认开启,注册中心的服务列表就算有些服务断开了,也会继续保存
enable-self-preservation: false
spring:
application:
#Eureka实例名,集群中根据这里相互识别
name: demo-server-eureka
Eureka2,端口6011
yml文件:
eureka:
client:
service-url:
defaultZone: http://localhost:6010/eureka/,http://localhost:6012/eureka/
#是否开启注册服务,因为这里如果为true表示自己注册自己,而自己就是一个服务注册方,没必要自己注册自己
register-with-eureka: false
#是否拉取服务列表,这里我只提供服务给别的服务。
fetch-registry: false
server:
#是否开启安全保护,默认是开启的,如果默认开启,注册中心的服务列表就算有些服务断开了,也会继续保存
enable-self-preservation: false
spring:
application:
#Eureka实例名,集群中根据这里相互识别
name: demo-server-eureka
Eureka3,端口6012
yml文件:
eureka:
client:
service-url:
defaultZone: http://localhost:6010/eureka/,http://localhost:6011/eureka/
#是否开启注册服务,因为这里如果为true表示自己注册自己,而自己就是一个服务注册方,没必要自己注册自己
register-with-eureka: false
#是否拉取服务列表,这里我只提供服务给别的服务。
fetch-registry: false
server:
#是否开启安全保护,默认是开启的,如果默认开启,注册中心的服务列表就算有些服务断开了,也会继续保存
enable-self-preservation: false
spring:
application:
#Eureka实例名,集群中根据这里相互识别
name: demo-server-eureka
其他基本不变,Eureka实现高可用原理其实很简单,就是多个Eureka相互注册,你向我注册,我向你注册。
然后分别启动这三个Eureka
注意看每张图的下面
比如:
registered-replicas http://localhost:6011/eureka/, http://localhost:6012/eureka/
停止任一eureka实例,DEMO2-SERVICE始终在注册列表中
Eureka之间还会互相同步注册数据,demo2-service的yml现在是:
defaultZone: http://localhost:6010/eureka/,http://localhost:6011/eureka/,http://localhost:6012/eureka/
其实也可以只写一个eureka的注册地址,在另两个eureka的页面上同样也能看到demo2-service
因为互相注册的eureka之间会互相同步数据,但是为了高可用还是建议写上所有的注册地址