一、关于
Eureka是Netflix开发的服务发现框架,本身是一个基于REST的服务,主要用于定位运行在AWS域中的中间层服务,以达到负载均衡和中间层服务故障转移的目的。SpringCloud将它集成在其子项目spring-cloud-netflix中,以实现SpringCloud的服务发现功能。
本文代码仓库地址:https://github.com/lazyrabb1t/rabb-springcloud-demo
二、创建Eureka注册中心
1、创建server模块
2、pom.xml引入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
3、application.yml配置
server:
port: 10002
eureka:
instance:
hostname: localhost
client:
register-with-eureka: false
fetch-registry: false
service-url:
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
4、启动类添加@EnableEurekaServer注解
@SpringBootApplication
@EnableEurekaServer
public class EurekaServerApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaServerApplication.class, args);
}
}
5、集群配置
添加两个配置文件,defaultZone中填对方的地址,分别使用这两个文件启动,它们就会互相注册,生成一个拥有双节点的注册中心集群。
注册文件1:
server:
port: 10003
eureka:
instance:
hostname: eureka-server-10003
client:
register-with-eureka: false
fetch-registry: false
service-url:
defaultZone: http://127.0.0.1:10004/eureka/
注册文件2:
server:
port: 10004
eureka:
instance:
hostname: eureka-server-10004
client:
register-with-eureka: false
fetch-registry: false
service-url:
defaultZone: http://127.0.0.1:10003/eureka/
6、添加用户认证
1)pom.xml添加security依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
2)application.yml配置用户名密码
spring:
security:
user:
name: lazyrabbit
password: 123456
3)添加WebSecurityConfig配置类,关闭csrf校验
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
// 默认情况下添加SpringSecurity依赖的应用每个请求都需要添加CSRF token才能访问,
// Eureka客户端注册时并不会添加,所以需要配置/eureka/**路径不需要CSRF token。
http.csrf().ignoringAntMatchers("/eureka/**");
// 注册时关闭用户认证
// http.authorizeRequests()
// .antMatchers("/eureka/**").permitAll();
super.configure(http);
}
}
4)最后修改所有项目中的defaultZone的地址
eureka:
client:
service-url:
defaultZone: http://lazyrabbit:123456@127.0.0.1:10003/eureka
7、常用配置项
官方文档:https://docs.spring.io/spring-cloud-netflix/docs/current/reference/html/appendix.html
eureka:
client: #eureka客户端配置
register-with-eureka: true #是否将自己注册到eureka服务端上去
fetch-registry: true #是否获取eureka服务端上注册的服务列表
service-url:
defaultZone: http://localhost:8001/eureka/ # 指定注册中心地址
enabled: true # 启用eureka客户端
registry-fetch-interval-seconds: 30 #定义去eureka服务端获取服务列表的时间间隔
instance: #eureka客户端实例配置
lease-renewal-interval-in-seconds: 30 #定义服务多久去注册中心续约
lease-expiration-duration-in-seconds: 90 #定义服务多久不去续约认为服务失效
metadata-map:
zone: jiangsu #所在区域
hostname: localhost #服务主机名称
prefer-ip-address: false #是否优先使用ip来作为主机名
server: #eureka服务端配置
enable-self-preservation: false #关闭eureka服务端的保护机制
三、创建Eureka服务提供者客户端
1、创建提供者模块,pom.xml添加eureka-client依赖
<properties>
<java.version>1.8</java.version>
<spring-cloud.version>2020.0.1</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.16</version>
</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、application.yml配置
server:
port: 10000
eureka:
client:
service-url:
defaultZone: http://127.0.0.1:10002/eureka
instance:
instance-id: provider-10000
spring:
application:
name: rabb-eureka-provider
3、添加服务
@SpringBootApplication
@RestController
@Slf4j
public class EurekaProviderApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaProviderApplication.class, args);
}
@GetMapping
public String hello() {
log.info("provider has bean invoked!");
return "Hello SpringCloud!";
}
}
四、创建Eureka消费者客户端
1、创建消费者模块,pom.xml添加依赖,同提供者模块
2、application.yml配置
server:
port: 10001
spring:
application:
name: rabb-eureka-consumer
eureka:
client:
service-url:
defaultZone: http://localhost:10002/eureka
instance:
instance-id: consumer-10001
3、调用服务
@SpringBootApplication
@RestController
@EnableEurekaClient
public class EurekaConsumerApplication {
@Autowired
RestTemplate restTemplate;
public static void main(String[] args) {
SpringApplication.run(EurekaConsumerApplication.class, args);
}
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
@GetMapping
public String hello() {
// return "INVOKE PROVIDER HELLO METHOD:" + restTemplate.getForEntity("http://localhost:10000", String.class).getBody();
return "INVOKE PROVIDER HELLO METHOD:" + restTemplate.getForEntity("http://RABB-EUREKA-PROVIDER", String.class).getBody();
}
}
参考
https://docs.spring.io/spring-cloud-netflix/docs/current/reference/html/