Eureka是Netflix出品的用于实现服务注册和发现的工具。Spring Cloud集成了Eureka,并提供了开箱即用的支持。Netflix在设计Eureka时遵循着A(可用性)P(分区容错性)原则,它是基于REST的服务,用于定位服务,以实现云端中间层服务发现和故障转移,功能类似于Dubbo的注册中心Zookeeper。Zookeeper更着重于C(一致性)P(分区容错性)。
Eureka采用C-S的设计架构,即包括了Eureka Server(服务端),Eureka Client(客户端)。
创建一个SpringBoot项目:maple-eureka-service
导入pom.xml需要的依赖
org.springframework.cloud
spring-cloud-starter-eureka-server
org.springframework.boot
spring-boot-starter-security
org.springframework.cloud
spring-cloud-dependencies
Dalston.SR3
pom
import
配置application.properties文件
# 服务注册中心端口号
server.port=1111
# 项目名
spring.application.name=eureka-server
# 注册中心主机名
eureka.instance.hostname=localhost
# false表示不向注册中心注册自己。
eureka.client.register-with-eureka=false
# false表示自己端就是注册中心,我的职责就是维护服务实例,并不需要去检索服务
eureka.client.fetch-registry=false
# 单机设置与Eureka Server交互的地址查询服务和注册服务都需要依赖这个地址(单机)
eureka.client.serviceUrl.defaultZOne=http://${eureka.instance.hostname}:${server.port}/eureka/
# Eureka高复用时设置其他的Eureka之间通信
#eureka.client.serviceUrl.defaultZOne=http://backup1:1112/eureka/,http://backup2:1113/eureka/
# Eureka服务端关闭心跳连接测试
#eureka.server.enable-self-preservation=false
# 是否启用安全策略 security.basic.enabled为true时表示开启
security.basic.enabled=true
security.user.name=admin
security.user.password=admin123
这里只做单机的Eureka,高可用的集群环境在后面的文章详细介绍。
配置主服务类文件MapleEurekaServiceApplication.java
添加 Eureka 服务声明注解@EnableEurekaServer
@EnableEurekaServer
@SpringBootApplication
public class MapleEurekaServiceApplication {
public static void main(String[] args) {
SpringApplication.run(MapleEurekaServiceApplication.class, args);
}
}
访问Eureck服务注册中心
在浏览器输入http://localhost:1111
显示登录页面,如果无需登录,则可以设置application.properties文件里属性rity.basic.enabled=false
登录之后显示以下页面,表示Eureka注册中心服务启动成功。
创建springBoot项目:maple-eureka-provider
导入pom.xml需要的依赖
org.springframework.cloud
spring-cloud-starter-eureka
org.springframework.boot
spring-boot-starter-actuator
org.springframework.cloud
spring-cloud-dependencies
Dalston.SR3
pom
import
配置application.properties文件
server.port=8087
spring.application.name=maple-provider
#如果注册中心服务不需要登录
#eureka.client.service-url.defaultZOne=http://master:1111/eureka/
#如果注册中心服务需要登录则:http://user:[email protected]:8761/eureka
eureka.client.service-url.defaultZOne=http://admin:[email protected]:1111/eureka/
配置主服务类文件MapleEurekaProviderApplication.java
添加 Eureka 客户端声明注解@EnableDiscoveryClient或@EnableEurekaClient
spring cloud中discovery service有许多种实现(eureka、consul、zookeeper等等)
@EnableDiscoveryClient基于spring-cloud-commons;
@EnableEurekaClient基于spring-cloud-netflix
注解@EnableEurekaClient上有@EnableDiscoveryClient注解,可以说基本就是EnableEurekaClient有@EnableDiscoveryClient的功能,@EnableEurekaClient注解就是一种方便使用eureka的注解而已,可以说使用其他的注册中心后,都可以使用@EnableDiscoveryClient注解
但是使用@EnableEurekaClient的情景,就是在服务采用eureka作为注册中心的时候,使用场景较为单一。
@EnableDiscoveryClient
@SpringBootApplication
public class MapleEurekaProviderApplication {
public static void main(String[] args) {
SpringApplication.run(MapleEurekaProviderApplication.class, args);
}
}
创建测试服务ProviderDemoController.java
@RestController
@RequestMapping("/demo")
public class ProviderDemoController {
@RequestMapping(value = "/providerDemo")
@ResponseBody
public String providerDemo(){
return "这是项目《maple-eureka-provider》ProviderDemo的数据";
}
}
创建springBoot项目:maple-eureka-client
导入pom.xml需要的依赖
org.springframework.cloud
spring-cloud-starter-eureka
org.springframework.cloud
spring-cloud-starter-ribbon
org.springframework.cloud
spring-cloud-dependencies
Dalston.SR3
pom
import
配置application.properties文件
server.port=8065
spring.application.name=maple-client
#如果注册中心服务不需要登录
#eureka.client.service-url.defaultZOne=http://master:1111/eureka/
#如果注册中心服务需要登录则:http://user:[email protected]:8761/eureka
eureka.client.service-url.defaultZOne=http://admin:[email protected]:1111/eureka/
配置主服务类文件MapleEurekaClientApplication .java
添加 Eureka 客户端声明注解@EnableDiscoveryClient
@EnableDiscoveryClient
@SpringBootApplication
public class MapleEurekaClientApplication {
public static void main(String[] args) {
SpringApplication.run(MapleEurekaClientApplication.class, args);
}
}
创建测试服务DemoController.java
@RestController
@RequestMapping("/demo")
public class DemoController {
private String PROVIDER_URL = "http://MAPLE-PROVIDER";
@Autowired
private RestTemplate restTemplate;
@RequestMapping(value = "/test")
public @ResponseBody String test(){
return restTemplate.getForEntity(PROVIDER_URL + "/demo/providerDemo" , String.class).getBody();
}
}
这里需要配置RestTemplate
@Configuration
public class TemplateConfig {
@Bean
@LoadBalanced //负载均衡
public RestTemplate restTemplate(ClientHttpRequestFactory factory){
return new RestTemplate(factory);
}
@Bean
public ClientHttpRequestFactory simpleClientHttpRequestFactory(){
SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory();
factory.setReadTimeout(15000);//ms
factory.setConnectTimeout(15000);//ms
return factory;
}
}
@LoadBalanced注解参考
SpringCloud微服务框架03 - Ribbon负载均衡一文
启动项目:maple-eureka-provider和maple-eureka-client
此时,Eureka的注册中心就可以看到注册的服务了。
在浏览器***问http://127.0.0.1:8065/demo/test.do显示页面:
此时,Eureka服务和发现已经搭建好了。
现在已经成功的实现了一个 Eureka 服务器,但是现在属于单节点的服务运行过程,如果说现在单节点的 Eureka 出现了错误, 导致无法使用,那么对于所有的微服务的架构就将出现整体的瘫痪,就需要进行 Eureka 集群搭建,同时利用集群可以有效的实现 HA 的处理机制,如果要进行集群的搭建一定要选择两台或以上的电脑完成,而基本的流程如下:
配置hosts文件
127.0.0.1 master
127.0.0.1 backup1
127.0.0.1 backup2
修改maple-eureka-service项目application.properties文件,并创建maple-eureka-service2、maple-eureka-service项目。
application.properties文件分别如下
# maple-eureka-service-----------------------------
# 服务注册中心端口号
server.port=1111
# 项目名
spring.application.name=eureka-server
#注册中心主机名
eureka.instance.hostname=master
# false表示不向注册中心注册自己。
eureka.client.register-with-eureka=false
# false表示自己端就是注册中心,我的职责就是维护服务实例,并不需要去检索服务
eureka.client.fetch-registry=false
# Eureka高复用时设置其他的Eureka之间通信
eureka.client.serviceUrl.defaultZOne=http://backup1:1112/eureka/,http://backup2:1113/eureka/
# maple-eureka-service2-----------------------------
#服务注册中心端口号
server.port=1112
spring.application.name=eureka-server
#注册中心主机名
eureka.instance.hostname=backup1
#服务注册中心的配置内容,指定服务注册中心的位置
eureka.client.serviceUrl.defaultZOne=http://master:1111/eureka/,http://backup2:1113/eureka/
# maple-eureka-service3-----------------------------
#服务注册中心端口号
server.port=1113
spring.application.name=eureka-server
#注册中心主机名
eureka.instance.hostname=backup2
#服务注册中心的配置内容,指定服务注册中心的位置
eureka.client.serviceUrl.defaultZOne=http://master:1111/eureka/,http://backup2:1112/eureka/
修改maple-eureka-client、maple-eureka-provider项目的application.properties文件eureka.client.service-url.defaultZon属性
eureka.client.service-url.defaultZOne=http://master:1111/eureka/,http://backup1:1112/eureka/,http://backup2:1113/eureka/
启动所有的 eureka 服务,而后进入到每一个服务的后台去观察运行的副本效果:
此时访问http://master:1111,显示如下:
参考:
EureKa:服务注册与发现
SpringCloud系列四:Eureka 服务发现框架(定义 Eureka 服务端、Eureka 服务信息、Eureka 发现管理、Eureka 安全配置、Eureka-HA(高可用) 机制、Eureka 服务打包部署)