服务发现组件 EUREKA
服务发现组件 EUREKA
版本 2.2.1 RELEASE
1. 介绍
服务发现是微服务架构中最重要的组件之一。手动配置服务(比如Nginx)是很繁琐的,可能需要随时更改配置信息,还要考虑到负载均衡和熔断。eureka作为服务发现组件,将这些复杂的功能和组件全部整合在了一起。
2. 简单上手
eureka分为了服务端(server)和客户端(client)。服务端一般是多节点,高可用配置。
1. eureka server(单节点模式)
该模块需要在pom里面引入下面的依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
<version>2.2.1.RELEASE</version>
</dependency>
在property文件中添加以下内容
#服务端口
server.port=8761
eureka.instance.hostname=localhost
#是否向eureka注册自己,服务端不注册
eureka.client.register-with-eureka=false
#是否从eureka获取注册表信息
eureka.client.fetch-registry=false
#eureka的注册中心地址
eureka.client.service-url.defaultZone=http://${eureka.instance.hostname}:${server.port}/eureka/
引入依赖后,在启动类上添加相关注解@EnableEurekaServer即可
@SpringBootApplication
@EnableEurekaServer
public class Application {
public static void main(String[] args) {
new SpringApplicationBuilder(Application.class).web(true).run(args);
}
}
启动服务后,http://localhost:8761为eureka页面地址
2. eureka client
该模块需要在pom里面引入下面的依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
<version>2.2.1.RELEASE</version>
</dependency>
在property文件中添加以下内容
#通过ip显示服务
eureka.instance.prefer-ip-address=true
#在eureka页面上展示的服务内容格式
eureka.instance.instance-id=${spring.cloud.client.ip-address}:${server.port}
#eureka的注册中心地址
eureka.client.service-url.defaultZone=http://localhost:8761/eureka/
<font color=Brown>注:spring获取ip地址为${spring.cloud.client.ip-address}</font>
引入依赖后,在启动类上添加相关注解@EnableDiscoveryClient即可
@EnableDiscoveryClient
@SpringBootApplication
public class CloudEurekaClientApplication {
public static void main(String[] args) {
SpringApplication.run(CloudEurekaClientApplication.class, args);
}
}
3. eureka server(多节点模式)
多节点模式下,server要互相注册,client只需要向其中一个server注册即可,其他server会同步注册信息
该模块需要在pom里面引入下面的依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
<version>2.2.1.RELEASE</version>
</dependency>
在pom文件中添加两个profile属性
<profiles>
<profile>
<id>peer1</id>
<properties>
<peer>peer1</peer>
</properties>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
</profile>
<profile>
<id>peer2</id>
<properties>
<peer>peer2</peer>
</properties>
</profile>
</profiles>
然后在resource目录下新建两个properties文件(application-peer1.properties和application-peer2.proerties),里面的内容分别为
peer1
server.port=10000
#eureka的注册中心地址
eureka.client.service-url.defaultZone=http://localhost:10001/eureka/
peer2
server.port=10001
#eureka的注册中心地址
eureka.client.service-url.defaultZone=http://localhost:10000/eureka/
表示互相向对方注册自己
再修改pom文件,让环境启动的时候自动加载与环境对应的properties文件
<build>
<!--打包出来的jar包名-->
<finalName>
eureka-server-${peer}
</finalName>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
<!--指定哪些文件为资源文件,并且可以过滤-->
<includes>
<include>application.properties</include>
<include>application-${peer}.properties</include>
</includes>
</resource>
</resources>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
最后,在application.properties文件中动态指定激活的环境(<font color=Brown>这一点很重要,否则spring虽然将对应的properties编译到target文件中,但是无法使用其中的内容</font>)
application.properties
spring.profiles.active=@peer@
4. 身份验证
在server的pom文件中引入security依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
<version>2.2.1.RELEASE</version>
</dependency>
在properties文件中设置用户名和密码
spring.security.user.name=user
spring.security.user.password=123
在对应环境的properties文件中将defaultZone进行修改(client和server都要修改)
eureka.client.service-url.defaultZone=http://${spring.security.user.name}:${spring.security.user.password}@localhost:10001/eureka/
在server新建一个securityconfig类,将eureka路径从csrf认证中忽略掉
@Component
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.csrf().ignoringAntMatchers("/eureka/**");
super.configure(http);
}
}
重新启动server,则在进入eureka页面的时候会先输入正确的用户名密码才能进入