Spring Cloud Eureka是Spring Cloud Netflix微服务套件中的一部分,它基于Netflix Eureka 做了二次封装.Spring Cloud 的Eureka增加了Spring Boot风格的自动化配置,我们只需要简单引入依赖和注解配置就能让Spring Boot构建的微服务轻松的与Eureka服务治理体系进行整合.
Eureka核心内容:
服务治理可以说是微服务架构中最为核心和基础的模块,它主要用来实现各个微服务实例的自动化注册于发现.
微服务系统的缺陷:
在服务不多的时候,我们可以通过做一些静态配置来完成服务的调用.当系统功能越来越复杂,相应的微服务页不断的增多,我们的静态配置文件就越来越难以维护.如果通过手工维护的方式,也极易发生错误或者是命名冲突,同时对于静态内容的维护也消耗大量的人力.
在服务治理框架中,通常都会构建一个注册中心,每个服务单元向注册中心登记自己提供的服务,将主机与端口号,版本号,通讯协议等一些附加信息告知注册中心,注册中心按照服务名分类组织服务清单.
例如:
我们有两个提供提供服务的A的进程分别运行在192.168.0.100:8000和192.168.0.101:8000位置上,另外还有三个提供服务B的进程分别运行在192.168.0.100:9000,192.168.0.101:9000,
192.168.0.102:9000位置上.当这些进程均启动,并向注册中心注册自己的服务之后,注册中心就会维护一个类似下面的服务清单.另外注册中心还需要以心跳的方式去检测清单的服务是否可用,若不可用会从清单中清楚,达到故障辟出的效果.
由于在服务治理框架下运作,服务间的调用不再通过制定具体的实例地址来实现.所以,服务调用方在调用服务提供方的接口的时候,并不知道知道实例的位置.因此,调用方需要向服务注册中心咨询服务,并获取所有服务的实例清单,以实现对具体实例的访问.
Spring Cloud Eureka,使用Neftlix Eureka来实现服务注册与发现,它既包含了服务端组件,页包含了客户端组件,并且服务端与客户端都是用Java写的,所以主要适用于通过Java实现的分布式系统,或是JVM兼容语言构建的系统.由于Eureka服务端的服务治理机制提供了完备的RESTful API,所以也支持非Java语言构建的微服务应用纳入Eureka的服务治理体系中来.只是其他语言平台需要自己来实现Eureka的客户端程序.
Eureka服务端
Eureka服务端,我们也称为注册中心,与其他的注册中心一样支持高可用配置.它依托于强一致性提供良好的服务实例可用性,可以对应多种不同的故障场景.如果Eureka以集群模式部署,当集群中有分片出现故障时,那么Eureka就会转入自我保护模式.它允许在分片故障期间继续提供服务的发现与注册,当故障分片恢复时,集群中的其他分片会把它们的状态再次同步回来.
Eureka客户端
Eureka客户端主要处理服务的注册与发现.客户端通过注解和参数配置的方式,嵌入在客户端应用程序的代码中,在程序运行时,Eureka客户端向注册中心注册自身提供的服务并周期性的发送心跳来更新服务租约,同时,也能从服务端查询当前注册的服务信息并把他们缓存到本地并周期性的刷新服务状态.
org.springframework.boot
spring-boot-starter-parent
2.1.3.RELEASE
com.wjh.cloud
eureka-server
0.0.1-SNAPSHOT
eureka-server
Demo project for Spring Boot
1.8
Greenwich.SR1
org.springframework.cloud
spring-cloud-starter-netflix-eureka-server
org.springframework.boot
spring-boot-starter-test
test
org.springframework.cloud
spring-cloud-dependencies
${spring-cloud.version}
pom
import
org.springframework.boot
spring-boot-maven-plugin
通过@EnableEurekaServer注解启动一个服务注册中心提供给其他应用程序对话.
@EnableEurekaServer
@SpringBootApplication
public class EurekaServerApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaServerApplication.class, args);
}
}
在默认设置下,该服务注册中心也会将自己作为服务尝试注册自己,所以我们需要禁用他的客户端注册行为,只需要在appliaction.properties中增加如下配置:
server.port=1111
eureka.instance.hostname=localhost
eureka.client.register-with-eureka=false
eureka.client.fetch-registry=false
eureka.client.service-url.defaultZone=http://${eureka.instance.hostname}:${server.port}/eureka/
启动应用并访问http://localhost:1111/,可以看到Eureka信息面板,其中instances currently with Eureka
是空的,说明还没有注册任何服务.
# 依赖
org.springframework.boot
spring-boot-starter-parent
2.1.3.RELEASE
com.wjh.cloud
service_1
0.0.1-SNAPSHOT
service_1
Demo project for Spring Boot
1.8
Greenwich.SR1
org.springframework.boot
spring-boot-starter-web
org.springframework.cloud
spring-cloud-starter-netflix-eureka-server
org.springframework.boot
spring-boot-starter-test
test
org.springframework.cloud
spring-cloud-dependencies
${spring-cloud.version}
pom
import
org.springframework.boot
spring-boot-maven-plugin
编写接口,通过注入对象,在日志中打印服务的相关内容.
# controller
@RestController
public class HelloController {
private final Logger logger = Logger.getLogger(getClass());
@Autowired
private DiscoveryClient client;
@GetMapping("/hello")
public String index() {
List instances = client.getInstances("1");
logger.info("我执行了");
return "hello word";
}
}
# 启动类
@EnableDiscoveryClient
@SpringBootApplication
public class Service1Application {
public static void main(String[] args) {
SpringApplication.run(Service1Application.class, args);
}
}
# application.properties中的配置
# 配置服务名
spring.application.name=hello-service
# 设置服务的注册中心
eureka.client.service-url.defaultZone=http://localhost:1111/eureka/
启动服务,查看Eureka信息面板状态
Eureka server 在设计的时候就考虑了高可用的问题,所有的节点即是服务的提供方也是服务的消费方,服务注册中心也不例外.
# 设置如下参数,让服务注册中心不注册自己
eureka.client.register-with-eureka=false
eureka.client.fetch-registry=false
Eureka的高可用实际上就是把自己作为服务在其他注册中心注册自己,这样就可以形成一组互相注册服务的注册中心,以实现服务清单的互相同步,达到高可用.
spring.application.name=eureka-server
server.prot=1111
eureka.instance.hostname=peer1
# 在peer2中注册自己的服务
eureka.client.server-url.defaultZone=http://peer2:1112/eureka/
spring.application.name=eureka-server
server.prot=1112
eureka.instance.hostname=peer2
# 在peer2中注册自己的服务
eureka.client.server-url.defaultZone=http://peer1:1111/eureka/
127.0.0.1 peer1
127.0.0.1 peer2
spring.profiles.active
属性分别启动peer1和peer2.java -jar xxx.jar --spring.profiles.active=peer1
java -jar xxx.jar --spring.profiles.active=peer2
eureka.client.server-url.defaultZone=http://peer1:1111/eureka/,.....
如果我们不想使用主机名来定义注册中心的地址,也可以使用IP的形式
# 使用IP形式定义注册中心
eureka.instance.prefer-ip-address=true