简介:
Spring Cloud Netflix Eureka是Netflix子项目的核心组件之一,主要用于微服务架构中的服务治理。 本文将对搭建Eureka注册中心,搭建Eureka客户端,搭建Eureka集群及给Eureka注册中心添加登录认证等进行介绍。
在微服务架构中往往会有一个注册中心,每个微服务都会向注册中心去注册自己的地址及端口信息,注册中心维护着服务名称与服务实例的对应关系。每个微服务都会定时从注册中心获取服务列表,同时汇报自己的运行情况,这样当有的服务需要调用其他服务
时,就可以从自己获取到的服务列表中获取实例地址进行调用,Eureka实现了这套服务注册与发现机制。
使用场景:
微服务架构的各个服务系统部分可能分布在多台机器上,Eureka的作用就是使各个服务直接能够相互调用。
原理:
每个服务中都集成了一个Eureka Client
组件,这个组件负责将当前服务信息发送到Eureka Server
中。Eureka Server
是注册中心,保存了各个服务的地址信息。各组件可以通过Eureka Client
获取其它服务的地址信息,并进行请求。
搭建Eureka Server 2节点集群:
使用IDEA创建一个maven工程SpringCloudRoot,作为父工程,
在创建一个子模块工程SpringCloudNetflix-Eureka,添加maven依赖:
加入注册中心安全认证依赖:
添加配置文件:此处借助IDEA一个应用程序多配置文件,启动多次的原理:(不懂的可以百度一下)
此处在本机配置了一个IP映射,集群之间相互注册使用域名的方式,在windows的host文件中添加如图映射
127.0.0.1 node1
127.0.0.1 node2
添加配置文件:application-node1.yml内容如下图,需要配置注册时用户名和密码,作为安全认证,同时在向注册中心注册的时候需要带上用户名和密码如图中的defaultZone属性
# 指定运行端口
server:
port: 8881
# 指定服务名称
spring:
application:
name: eureka-server-1
security:
user:
# 配置spring security登录用户名和密码
name: root
password: root
# 指定主机地址
eureka:
instance:
hostname: node1
appname: ${spring.application.name}
client:
#表示是否将自己注册到Eureka Server上,默认为true
register-with-eureka: true
#表示是否从Eureka Server上获取注册信息,默认为true
fetch-registry: true
service-url:
#注册到另一个Eureka注册中心
defaultZone: http://root:root@node2:8882/eureka/
添加第二个配置文件:application-node2.yml
# 指定运行端口
server:
port: 8882
# 指定服务名称
spring:
application:
name: eureka-server-2
security:
user:
# 配置spring security登录用户名和密码
name: root
password: root
# 指定主机地址
eureka:
instance:
hostname: node2
appname: ${spring.application.name}
client:
#表示是否将自己注册到Eureka Server上,默认为true
register-with-eureka: true
#表示是否从Eureka Server上获取注册信息,默认为true
fetch-registry: true
service-url:
#注册到另一个Eureka注册中心
defaultZone: http://root:root@node1:8881/eureka/
创建springboot的启动类,在启动类上面添加 @EnableEurekaServer 注解
@SpringBootApplication
@EnableEurekaServer
public class SpringCloudNetflixEurekaApplication {
public static void main(String[] args) {
SpringApplication.run(SpringCloudNetflixEurekaApplication.class, args);
}
}
添加Java配置WebSecurityConfig,必须设置不然会报错
默认情况下添加SpringSecurity依赖的应用每个请求都需要添加CSRF token才能访问,Eureka客户端注册时并不会添加,所以需要配置/eureka/**路径不需要CSRF token。
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.csrf().ignoringAntMatchers("/eureka/**");
super.configure(http);
}
}
分配制启动两个EurekaServer,访问http://node1:8881/
双节点的集群已经搭建好了。
在搭建一个EurekaClient 注册到注册中心
创建一个SpringCloudNetflix-EurekaClient 子模块工程
添加依赖:
<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-client</artifactId>
<version>2.2.3.RELEASE</version><!--此处需要添加版本号,和父项目中对应,不然报错-->
</dependency>
创建启动类 加上注解 @EnableDiscoveryClient
@SpringBootApplication
@EnableDiscoveryClient
public class SpringCloudNetflixEurekaClientApplication {
public static void main(String[] args) {
SpringApplication.run(SpringCloudNetflixEurekaClientApplication.class, args);
}
}
加入配置文件:application-node.yml,注册中心的地址一定要带上用户名和密码,如下defaultZone属性所示。
server:
port: 8880
spring:
application:
name: eureka-client
eureka:
client:
#表示是否将自己注册到Eureka Server上,默认为true
register-with-eureka: true
#表示是否从Eureka Server上获取注册信息,默认为true
fetch-registry: true
service-url:
# 同时注册到两个注册中心
defaultZone: http://root:root@node1:8881/eureka,http://root:root@node2:8882/eureka
启动springboot,刷新注册中心页面,可以看到客服端注册完成了。