Eureka进阶
一、Eureka Server的高可用
因为单节点Eureka Server并不适合线上生产环境,Eureka Client会定时连接Eureka Server,获取服务注册列表中到的信息并缓存到本地。微服务在消费远程API时总是使用本地缓存中的数据。因此一般来说,即使Eureka发生宕机,也不会影响服务之间的调用。但如果Eureka Server宕机时,某些微服务也出现了不可用的情况,Eureka Client中的缓存若不更新,就可能会影响微服务的调用,甚至影响整个应用系统的高可用性。因此,在生产环境中,通常会部署一个高可用的Eureka Server集群。
(1)实现高可用Eureka Server
Eureka Server可以通过运行多个实例并相互注册的方式实现高可用部署,Eureka Server实例会彼此增量地同步信息,从而确保所有节点数据一致。事实上,节点之间相互注册是Eureka Server默认行为,还记得在Eureka基础中的eureka.client.registerWithEureka:false和eureka.client.fetchRegistry:false这两个配置吗,通过这两个可以取消互相注册。
(2)案例实现
1、配置系统的hosts文件
Windows系统的hosts文件路径是C:\Windows\System32\drivers\etc\hosts;
Linux及Mac Os等系统的文件路径是:/etc/hosts
2、修改application.yml文件,事项两个节点的Eureka Server相互注册
spring:
application:
name:该模块的服务名
---
spring:
profiles:peer1
server:
port:8761
eureka:
instance:
hostname:peer1
client:
serviceUrl:
defaultZone:http://peer2:8762/eureka/
---
spring:
profiles:peer2
server:
port:8762
eureka:
instance:
hostname:peer2
client:
serviceUrl:
defaultZone:http://peer1:8761/eureka/
注释:
“---”表示连接字符,用于将该application.yml文件分为三段。第二段和第三段分别为spring.properties指定了一个值,该值表示它所在的那段内容用在那个profile里。第一段由于并未指定spring.profiles,因此这段内容会对所有Profile生效。
配置文件的相关理解:我们定义了peer1和peer2这两个profile,当应用以peer1这个profile启动时,配置Eureka Server的主机名为peer1,并将其注册到http://peer2:8762/eureka/;反之,当应用以profile=peer2时,Eureka Server会注册到peer1节点的Eureka Server。
3、application.yml文件的另外一种配置方法
spring:
application:
name:该模块的服务名
eureka:
instance:
hostname:peer1
eureka:
client:
serviceUrl:
defaultZone:http://peer2:8762/eureka/,http://peer1:8761/eureka/
---
spring:
profiles:peer1
server:
port:8761
eureka:
instance:
hostname:peer1
---
spring:
profiles:peer2
server:
port:8762
eureka:
instance:
hostname:peer2
(3)将应用注册到Eureka Server集群上,修改application.yml文件
eureka:
client:
serviceUrl:
defaultZone:http://peer2:8762/eureka/,http://peer1:8761/eureka/
通过配置多个Eureka Server地址,就可以将其注册到Eureka Server集群上,当然,微服务即使只配置Eureka Server集群中的某一个节点,也能正常注册到Eureka Server集群,因为多个Eureka Server之间的数据会相互同步。在正常情况下,这种方式与配置多个server节点的效果是一样的,不过为适应某些极端场景,建议在客户端配置多个Eureka Server节点。
二、用户认证
在我们前面的案例中,Eureka Server是允许匿名访问的,在实际项目中,可能希望经过用户认证才允许访问Eureka Server。
1、为Eureka Server添加用户认证,创建Eureka Server 模块
(1)、jar包依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
(2)、application.yml文件
server: port: 6868 security: basic: enabled: true user: name: user password: password123 eureka: client: registerWithEureka: false fetchRegistry: false serviceUrl: defaultZone: http://user:password123@127.0.0.1:${server.port}/eureka/
注释:
通过以上配置就为Eureka Server添加了基于HTTP basic的认证,如果不设置这段内容,账号默认是user,密码是一个随机值,该值会在启动时打印出来;
(3)测试
当我们启动该模块后,在地址栏输入:http://127.0.0.1:6868/时就需要身份验证,通过输入用户名和密码后就可登录。
2、将微服务注册到需要认证的Eureka Server
(1)修改application.yml文件
eureka:
client:
serviceUrl:
defaultZone: http://user:password123[@127.0.0.1](https://my.oschina.net/u/567043):6868/eureka/
如果需要满足负责的需求,就可以通过创建一个类为为DiscoveryVlientOptionalArgs的@Bean,并向其中注入ClientFilter
package com.yczj;
import com.netflix.discovery.DiscoveryClient;
import com.sun.jersey.api.client.filter.ClientFilter;
import com.sun.jersey.api.client.filter.HTTPBasicAuthFilter;
import org.springframework.context.annotation.Bean;
import java.util.ArrayList;
import java.util.List;
public class DiscoveryVlientOptionalArgs {
[@Bean](https://my.oschina.net/bean)
public DiscoveryClient.DiscoveryClientOptionalArgs discoveryClientOptionalArgs() {
DiscoveryClient.DiscoveryClientOptionalArgs discoveryClientOptionalArgs = new DiscoveryClient.DiscoveryClientOptionalArgs();
List<ClientFilter> addit = new ArrayList<>();
addit.add(new HTTPBasicAuthFilter("user", "password123"));
discoveryClientOptionalArgs.setAdditionalFilters(addit);
return discoveryClientOptionalArgs;
}
}
注释:需要添加jar包
<dependency>
<groupId>com.sun.jersey</groupId>
<artifactId>jersey-client</artifactId>
<version>1.19.1</version>
</dependency>