目录
Spring Cloud Eureka
Eureka是Netflix开源的基于Jersey框架实现的REST服务注册中心。Spring Cloud 在次基础之上进行了封装纳入到Spring Cloud体系中。
启动 Spring Cloud Eureka 服务
Spring cloud Eureka 主要依赖 org.springframework.cloud:spring-cloud-starter-netflix-eureka-server,快速启动可以配置如下:
<properties>
<java.version>1.8</java.version>
<spring-cloud.version>Hoxton.SR5</spring-cloud.version>
</properties>
<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-security</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
项目资源文件的配置文件bootstrap.yml或者application.properties的配置如下:
server:
port: 8761
eureka:
instance:
hostname: localhost
client:
registerWithEureka: false
fetchRegistry: false
serviceUrl:
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
spring:
security:
user:
name: account
password: password
由于引入security框架,所以需要将没有必要做权限校验的路基过滤调。
@EnableWebSecurity
public class CustomConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.csrf().ignoringAntMatchers("/eureka/**");
super.configure(http);
}
}
配置项目入口:
@SpringBootApplication
@EnableEurekaServer
public class EurekatestApplication {
public static void main(String[] args) {
SpringApplication.run(EurekatestApplication.class, args);
}
}
Eureka 服务不需要配置数据库,所有注册的服务地址都存在本地内存。本地可用服务信息会保留一小段时间,之后如果没有心跳请求告诉Eureka服务,那么可用服务将会从内存中删除。所以客户端需要维持心跳请求,保障服务在过期时间内不断续约。Eureka 客户端会保留一份可用服务的缓存,如此可以避免每次请求都访问Eureka服务获取最新的可用服务列表。
Eureka 服务一般建议部署成集群,减少单点故障的风险。默认情况下Eureka服务同时也是Eureka客户端,通过配置信息了解其他集群节点的位置,并维持同样一份可用服务列表。单独部署一台Eureka服务也是能够正常提供服务注册服务,但是会通过日志大量记录无法注册到其他Eureka服务的信息。
默认注册到 Eureka 服务的服务名称是域名加端口好,但是如果应用无法识别域名,那么会将IP地址注册到 Eureka 中。eureka.instance.hostname 可以指定服务的域名,如果有该配置,应用则直接将该域名注册到 Eureka 中。如果希望能够使用IP地址注册,可以通过eureka.instance.preferIpAddress = true 实现。
Spring Cloud Eureka 客户端的配置和使用
获取 Eureka服务列表
Spring cloud Eureka 客户端主要依赖 org.springframework.cloud:spring-cloud-starter-netflix-eureka-client,快速启动可以配置如下:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-ribbon</artifactId>
</exclusion>
<exclusion>
<groupId>com.netflix.ribbon</groupId>
<artifactId>ribbon-eureka</artifactId>
</exclusion>
</exclusions>
</dependency>
Eureka 客户配置 Eureka 服务地址
eureka:
client:
serviceUrl:
defaultZone: http://localhost:8761/eureka/
鉴于 Eureka 服务引入security框架,所以还需要配置用户账号密码
spring:
security:
user:
name: username
password: password
注册服务
以上配置完毕后可以从Eureka中获取可用服务列表。但是除此之外我们还需要将服务注册到Eureka中。
eureka:
instance:
status-page-urlPath: /info
healthCheckUrlPath: /health
prefer-ip-address: true
instance-id: ${spring.application.name}:${spring.cloud.client.ip-address}:${spring.application.instance_id:${server.port}}
appname: ${spring.application.name}
lease-renewal-interval-in-seconds: 5
lease-expiration-duration-in-seconds: 10
instance相关配置在org.springframework.cloud.netflix.eureka.EurekaInstanceConfigBean以属性的方式存在,可以根据业务情况更改默认值。
配置程序入口:
@SpringBootApplication
@EnableEurekaClient
public class ConfigserverApplication {
public static void main(String[] args) throws SocketException {
ApplicationContext ac = SpringApplication.run(ConfigserverApplication.class, args);
}
}
程序启动后服务将会自动注册到Eureka中