赞
踩
Eureka就是帮助我们维护所有服务的信息,以便服务之间的相互调用
搜索模块将服务注册到Eureka上,客户端模块去Eureka上发现模块
创建一个父工程,并且在父工程中指定SpringCloud的版本,并且将packaing修改为pom
<dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Greenwich.SR6</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
创建eureka的server,创建SpringBoot工程,并且导入依赖,在启动类中添加注解,编写yml文件
<dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> </dependencies>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
启动类添加注解
@SpringBootApplication @EnableEurekaServer public class EurekaApplication { public static void main(String[] args) { SpringApplication.run(EurekaApplication.class,args); } }
- 1
- 2
- 3
- 4
- 5
- 6
- 7
编写yml配置文件
server: port: 8761 # 端口号 eureka: instance: hostname: localhost # localhost client: # 当前的eureka服务是单机版的 registerWithEureka: false fetchRegistry: false serviceUrl: defaultZone: >http://${eureka.instance.hostname}:${server.port}/eureka/
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
创建Maven工程,修改为SpringBoot
导入依赖<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency>
- 1
- 2
- 3
- 4
在启动类上添加注解
@SpringBootApplication @EnableEurekaClient public class CustomerApplication { public static void main(String[] args) { SpringApplication.run(CustomerApplication.class,args); } }
- 1
- 2
- 3
- 4
- 5
- 6
- 7
编写配置文件
# 指定Eureka服务地址 eureka: client: service-url: defaultZone: http://localhost:8761/eureka #指定服务的名称 spring: application: name: CUSTOMER
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
创建了一个Search搜索模块,并且注册到Eureka
使用到EurekaClient的对象去获取服务信息@Autowired private EurekaClient eurekaClient;
- 1
- 2
正常RestTemplate调用即可
@GetMapping("/customer") public String customer(){ //1. 通过eurekaClient获取到SEARCH服务的信息 InstanceInfo info = eurekaClient.getNextServerFromEureka("SEARCH", false); //2. 获取到访问的地址 String url = info.getHomePageUrl(); System.out.println(url); //3. 通过restTemplate访问 String result = restTemplate.getForObject(url + "/search", String.class); //4. 返回 return result; }
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
实现Eureka认证
导入依赖<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency>
- 1
- 2
- 3
- 4
编写配置类
@EnableWebSecurity public class WebSecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { // 忽略掉/eureka/** http.csrf().ignoringAntMatchers("/eureka/**"); super.configure(http); } }
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
编写配置文件
# 指定用户名和密码 spring: security: user: name: root password: root
- 1
- 2
- 3
- 4
- 5
- 6
其他服务想注册到Eureka上需要添加用户名和密码
eureka: client: service-url: defaultZone: http://用户名:密码@localhost:8761/eureka
- 1
- 2
- 3
- 4
如果程序的正在运行,突然Eureka宕机了。
- 如果调用方访问过一次被调用方了,Eureka的宕机不会影响到功能。
- 如果调用方没有访问过被调用方,Eureka的宕机就会造成当前功能不可用。
搭建Eureka高可用
- 准备多台Eureka
- 采用了复制的方式,删除iml和target文件,并且修改pom.xml中的项目名称,再给父工程添加一个module
- 让服务注册到多台Eureka
eureka: client: service-url: defaultZone: http://root:root@localhost:8761/eureka,http://root:root@localhost:8762/eureka
- 1
- 2
- 3
- 4
让多台Eureka之间相互通讯
eureka: client: registerWithEureka: true # 注册到Eureka上 fetchRegistry: true # 从Eureka拉取信息 serviceUrl: defaultZone: http://root:root@localhost:8762/eureka/
- 1
- 2
- 3
- 4
- 5
- 6
EurekaClient启动是,将自己的信息注册到EurekaServer上,EurekaSever就会存储上EurekaClient的注册信息。
当EurekaClient调用服务时,本地没有注册信息的缓存时,去EurekaServer中去获取注册信息。
EurekaClient会通过心跳的方式去和EurekaServer进行连接。(默认30sEurekaClient会发送一次心跳请求,如果超过了90s还没有发送心跳信息的话,EurekaServer就认为你宕机了,将当前EurekaClient从注册表中移除)
eureka: instance: lease-renewal-interval-in-seconds: 30 #心跳的间隔 lease-expiration-duration-in-seconds: 90 # 多久没发送,就认为你宕机了
- 1
- 2
- 3
- 4
EurekaClient会每隔30s去EurekaServer中去更新本地的注册表
eureka: client: registry-fetch-interval-seconds: 30 # 每隔多久去更新一下本地的注册表缓存信息
- 1
- 2
- 3
Eureka的自我保护机制,统计15分钟内,如果一个服务的心跳发送比例低于85%,EurekaServer就会开启自我保护机制
- 不会从EurekaServer中去移除长时间没有收到心跳的服务。
- EurekaServer还是可以正常提供服务的。
- 网络比较稳定时,EurekaServer才会开始将自己的信息被其他节点同步过去
eureka: server: enable-self-preservation: true # 开启自我保护机制
- 1
- 2
- 3
CAP定理,C - 一致性,A-可用性,P-分区容错性,这三个特性在分布式环境下,只能满足2个,而且分区容错性在分布式环境下,是必须要满足的,只能在AC之间进行权衡。
如果选择CP,保证了一致性,可能会造成你系统在一定时间内是不可用的,如果你同步数据的时间比较长,造成的损失大。
Eureka就是一个AP的效果,高可用的集群,Eureka集群是无中心,Eureka即便宕机几个也不会影响系统的使用,不需要重新的去推举一个master,也会导致一定时间内数据是不一致。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。