eureka服务注册与发现
一、Eureka简介
Eureka是Netflix出品的用于实现服务器注册和发现的工具。Eureka本身是一个基于REST的服务,主要用于定位运算在AWS域中的中间层服务,以达到负载均衡和中间层服务故障转移的目的。Spring Cloud 集成在其子项目Spring-cloud-netflix中,并提供了开箱即用的支持。其中,Eureka又可细分为Eureka Server和Eureka Client。
1. 调用关系说明:
- 服务提供者在启动时,向注册中心注册自己提供的服务。
- 服务消费者在启动时,向注册中心订阅自己所需要的服务。
- 注册中心返回服务提供者地址给消费者。
- 服务消费者从提供者地址中调用消费者。
1.1 Eureka Server: 提供服务注册服务,各个节点启动后,会在Eureka Server中进行注册,包括主机与端口号、服务版本号、通讯协议等。这样EurekaServer中的服务注册表中将会存储所有可用服务节点的信息,服务节点的信息可以在界面中直观的看到。Eureka服务提供者(服务端)支持集群模式部署,首尾相连形成一个闭环即可,集群中的不同服务注册中心通过异步模式互相复制各自的状态,这也意味着在给定的时间点每个实例关于所有服务的状态可能存在不一致的现象。
1.2 Eureka Client: 主要处理服务的注册和发现。客户端服务通过注册和参数配置的方式,嵌入在客户端应用程序的代码中。在应用程序启动时,Eureka客户端向服务注册中心注册自身提供的服务,并周期性的发送心跳来更新它的服务租约。同时,它也能从服务端查询当前注册的服务信息并把它们缓存到本地并周期性的刷新服务状态。
1.3 服务调用
服务消费者在获取服务清单后,通过服务名可以获取具体提供服务的实例名和该实例的源数据信息。因为有这些服务实例的详细信息,所以客户端可以根据自己的需要决定具体调用哪个实例,在Ribbon中会默认采用轮询的方式进行调用,从而实现客户端的负载均衡。
二、服务注册中心搭建
1. 使用Maven项目管理工具:
1.1 pom引入
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.2.RELEASE</version>
<relativePath></relativePath>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka-server</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
2. Gradle自动化部署
2.1 build.gradle引入
dependencies {
testCompile( "org.springframework.boot:spring-boot-starter-test" )
compile( "org.glassfish.jaxb:jaxb-runtime" )
compile( "org.springframework.boot:spring-boot-starter" )
compile( 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-server' )
compile( 'org.springframework.boot:spring-boot-starter-security' )
}
3. 编辑启动类
@SpringBootApplication
@EnableEurekaServer
public class EurekaApp {
private static final Logger LOG = LoggerFactory.getLogger( EurekaApp.class.getName() );
public static ApplicationContext AppContext;
public static void main( String[] args ) throws Exception{
AppContext = SpringApplication.run( EurekaApp.class, args );
}
@Bean
public CommandLineRunner beanInfo( ApplicationContext ctx ){
return args -> {
LOG.info( "Eureka构建完成!" );
};
}
}
4. WebSecurityConfig 开启 CSRF 防护机制取消
- 官网“Securing The Eureka Server” 中提到
默认情况下,当 spring security 在类路径上时,它要求用户向应用程序发送请求时,都必须携带一个有效的 csrf 令牌,而 Eureka 客户端通常不会拥有有效的跨站点请求(CSRF)令牌,此时 Eureka Serer 端应该对 eureka 的请求路径放行。 - 关于 CSRF 防护简单介绍如下:
CSRF(Cross-site request forgery) 是指跨站请求伪造,是 web 常见的攻击之一,从 Spring Security 4.0 开始,默认情况下 security 会启用 CSRF 保护,以防止 CSRF 攻击应用程序。可以参考《spring security CSRF防护》 - 有一点必须注意:这里的身份验证与这个 CSRF 跨站请求伪造防护是两码事,身份验证指的是登录系统时必须先登录,而 CSRF 防护是要求请求时携带一个 CSRF 令牌。
- 意思已经很明确了,就是 Spring Security 要求用户访问的请求的时候,必须携带一个 跨站点请求(CSRF)令牌,而显然 Eureka Client 要么就是能提供这个令牌,要么就是在 Eureka Server 直接忽略掉 Eureka Client 的请求,也就是不对这些请求进行防护。
5 在Spring Boot搭建Eureka Server (单机模式)中新建此配置类:
配置类创建路径自拟。
/**
* Created by Administrator on 2019/3/7 0007.
* EnableWebSecurity :表示开启 web 安全验证,继承 WebSecurityConfigurerAdapter ,然后覆盖默认的配置
* 将本配置类放在与启动类同级,则程序一启动就会自动执行
*/
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
/**
* ignoringAntMatchers(String... antPatterns):表示对某些请求,如果符合匹配的规则,则忽略对它们的 CSRF 防护
* /eureka/**:首斜杠表示应用上下文路径,也就是说对所有符合 http://ip:port/context-paht/eureka/** 的请求全部忽略对它们的 CSRF 防护
* 所以只要 eureka.client.serviceUrl.defaultZone 的值符合此规则,就不会被 CSRF 防护了
*/
http.csrf().ignoringAntMatchers("/eureka/**");
/**
* 还有一个一劳永逸的方式是直接禁止 CSRF 防护:
* http.csrf().disable();//完全禁止 CSRF 防护
*/
super.configure(http);
}
}
5.1 添加配置在application.yml文件
#server (eureka默认端口为:8761)这里改成8901
#用户名:fc 密码:fc888
#eureka服务器地址(注:地址最后面的/eureka/这个是固定值)
#是否从eureka获取注册信息
#eureka.client.fetch-registry=false
# 是否注册到eureka(eureka本身是不需要再注册到自己的)
#eureka.client.register-with-eureka=false
# 续期时间,即扫描失效服务的间隔时间(缺省为60*1000ms) #eureka.server.eviction-interval-timer-in-ms: 5000
# 自我保护模式(缺省为打开)
#eureka.server.enable-self-preservation: true
#无需登录成功访问:
#spring.security.basic.enabled:false
#设置当前实例的主机名称
#eureka.instance.hostname
#不使用主机名来定义注册中心的地址,而使用IP地址的形式,如果设置了
#eureka.instance.ip-address 属性,则使用该属性配置的IP,否则自动获取除#环路IP外的第一个IP地址
#eureka.instance.prefer-ip-address:false
#服务名:kenyteEurekaServer
server:
port: 8901
spring:
application:
name: kenyteEurekaServer
security:
basic:
enabled: false
user:
name: fc
password: fc888
eureka:
instance:
hostname: localhost
prefer-ip-address: false
server:
enable-self-preservation: false
eviction-interval-timer-in-ms: 4000
client:
registerWithEureka: false
fetchRegistry: false
serverUrl:
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
6.启动项目
- 运行项目
- 登录eureka注册中心页面查看服务启动,以及服务提供者都有哪些。
- 访问地址:localhost:8901