Spring Cloud之Eureka服务治理
一、Eureka概述
Spring Cloud Eureka实现了服务治理的功能,Eureka提供服务端与客户端,服务端即是Eureka服务注册中心,客户端完成微服务向Eureka服务的注册与发现。
服务端与客户端的关系
1、Eureka Server是服务端,负责管理各各微服务结点的信息和状态。
2、在微服务上部署Eureka Client程序,远程访问Eureka Server将自己注册在Eureka Server。
3、微服务需要调用另一个微服务时从Eureka Server中获取服务调用地址,进行远程调用。
注册中心的作用
1、由于微服务数量众多,要进行远程调用就需要知道服务端的ip地址和端口,注册中心可以帮助管理这些服务的ip和端口。
2、微服务会实时上报自己的状态,注册中心统一管理这些微服务的状态,将存在问题的服务踢出服务列表,客户端获取到可用的服务进行调用。
二、Eureka Server搭建
单机环境搭建
在父工程添加依赖
<!-- spring-cloud的版本是以伦敦地铁站的名称命名,同时根据字母表的顺序对应版本的时间顺序 -->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Hoxton.SR8</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
在Eureka Server工程添加依赖
<dependencies>
<!-- 导入Eureka服务的依赖 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
</dependencies>
配置启动类 :在启动类上用@EnableEurekaServer
标识此服务为Eureka服务
@EnableEurekaServer
@SpringBootApplication
public class EurekaServiceApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaServiceApplication.class,args);
}
}
配置application.yml
server:
port: ${PORT:8888} #服务端口,PORT没有指定值则使用8888
spring:
application:
name: EurekaServiceApplication #指定服务名
eureka:
client:
registerWithEureka: false #服务注册,是否将自己注册到Eureka服务中,被其它服务调用时需向Eureka注册
fetchRegistry: false #服务发现,是否从Eureka中获取注册信息,需要从Eureka中查找要调用的目标服务时需要设置为true
serviceUrl: #Eureka客户端与Eureka服务端的交互地址,高可用状态配置对方的地址,单机状态配置自己(如果不配置则默认本机8761端口)
defaultZone: ${EUREKA_SERVER:http://127.0.0.1:8888/eureka/}
server:
enable-self-preservation: false #是否开启自我保护模式,开发阶段一般关闭
eviction-interval-timer-in-ms: 60000 #服务注册表清理间隔(单位毫秒,默认是60*1000)清理失效结点的间隔,在这个时间段内如果没有收到该结点的上报则将结点从服务列表中剔除。
启动Eureka Server
红色提示信息说明:
THE SELF PRESERVATION MODE IS TURNED OFF.THIS MAY NOT PROTECT INSTANCE EXPIRY IN CASE OF NETWORK/OTHER PROBLEMS.
自我保护模式被关闭。在网络或其他问题的情况下可能不会保护实例失效。
Eureka Server自我保护模式
Eureka Server有一种自我保护模式,当微服务不再向Eureka Server上报状态,Eureka Server会从服务列表将此服务删除,如果出现网络异常情况(微服务正常),此时Eureka server进入自保护模式,不再将微服务从服务列表删除。
高可用环境搭建
Eureka Server 高可用环境需要部署两个Eureka server,它们互相向对方注册。如果在本机启动两个Eureka需要注意两个Eureka Server的端口要设置不一样。
实现高可用的过程
1、在实际使用时Eureka Server至少部署两台服务器,实现高可用。
2、两台Eureka Server互相注册。
3、微服务需要连接两台Eureka Server注册,当其中一台Eureka死掉也不会影响服务的注册与发现。
4、微服务会定时向Eureka server发送心跳,报告自己的状态。
5、微服务从注册中心获取服务地址以RESTful方式发起远程调用。
Eureka 组成高可用,两个Eureka互相向对方注册,通过域名或主机名访问,修改hosts设置两个Eureka服务的主机名分别为 www.eureka1.com、www.eureka2.com。
127.0.0.1 www.eureka1.com
127.0.0.1 www.eureka2.com
配置eureka
server:
port: ${PORT:8888} #服务端口,${PORT:8888},通过虚拟机参数动态设置端口,不设置默认是8888
spring:
application:
name: EurekaServiceApplication #指定服务名
eureka:
client:
registerWithEureka: true #服务注册,是否将自己注册到Eureka服务中
fetchRegistry: true #服务发现,是否从Eureka中获取注册信息
serviceUrl: #Eureka客户端与Eureka服务端的交互地址,高可用状态配置对方的地址,单机状态配置自己(如果不配置则默认本机8761端口)
defaultZone: ${EUREKA_SERVER:http://www.eureka2.com:9999/eureka/}
server:
enable-self-preservation: false #是否开启自我保护模式,开发阶段一般关闭
eviction-interval-timer-in-ms: 60000 #服务注册表清理间隔(单位毫秒,默认是60*1000)
instance:
hostname: ${EUREKA_DOMAIN:www.eureka1.com}
Eureka Server1
对第一个Eureka Server1不做任何处理,使用默认值
Eureka Server2
复制Eureka Server1得到Eureka Server2副本,设置虚拟机参数动态指定端口,注册地址,hostname主机名
-DPORT=9999
-DEUREKA_SERVER=http://www.eureka1.com:8888/eureka/
-DEUREKA_DOMAIN:www.eureka2.com
启动两个Eureka Server,分别访问
http://localhost:9999/
http://localhost:8888/
Eureka Server1
Eureka Server2
三、Eureka服务注册
创建一个服务提供者 (eureka client),当client向server注册时,它会提供一些元数据,如主机和端口,URL等。Eureka server从每个client实例接收心跳消息。 如果心跳超时,则通常将该实例从注册server中删除。
引入依赖
在一个服务中引入Eureka客户端的依赖
<!‐‐ 引入Eureka客户端的依赖 ‐‐>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring‐cloud‐starter‐netflix‐eureka‐client</artifactId>
</dependency>
配置application.yml
在application.yml配置
server:
port: ${PORT:8081}
spring:
application:
name: eureka-client1
eureka:
instance:
hostname: localhost
client:
registerWithEureka: true #服务注册开关
fetchRegistry: true #服务发现开关
serviceUrl: #Eureka客户端与Eureka服务端进行交互的地址,多个中间用逗号分隔
defaultZone: ${EUREKA_SERVER:http://www.eureka1.com:8888/eureka/,http://www.eureka2.com:9999/eureka/}
instance:
prefer-ip-address: true #将自己的ip地址注册到Eureka服务中
ip-address: ${IP_ADDRESS:127.0.0.1}
instance-id: ${spring.application.name}:${server.port} #指定实例id
启动类添加注解
在启动类上添加注解 @EnableDiscoveryClient
或@EnableEurekaClient
,表示它是一个Eureka的客户端.
相同点: @EnableDiscoveryClient
或@EnableEurekaClient
注解用于发现服务和注册服务
不同点: @EnableEurekaClient
只适用于Eureka作为注册中心,@EnableDiscoveryClient
可以是其他注册中心。
@EnableDiscoveryClient
@SpringBootApplication
public class EurekaClientApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaClientApplication.class,args);
}
}
提供服务
org.springframework.cloud.client.discovery.DiscoveryClient对象,可以获取服务的一些信息。
@RestController
public class TestController {
@Autowired
private DiscoveryClient client;
@GetMapping("/getInfo")
public String getInfo() {
List<String> services = client.getServices();
for (String service : services) {
System.out.println(service);
}
String info = null;
List<ServiceInstance> instances = client.getInstances("eureka-client1");
for (ServiceInstance instance : instances) {
info = "host:" + instance.getHost() + ",service_id:" + instance.getServiceId();
}
return info;
}
}
启动参数配置
Eureka Client1,使用默认配置。
Eureka Client2,动态设置端口与IP
执行测试
访问提供的服务
刷新Eureka Server查看注册情况
Eureka Server1
Eureka Server2
再启动一个Eureka Client2
四、服务消费
Eureka客户端既是服务提供者,也是服务消费者,即自身的接口可能被别的服务访问,同时也可能调用别的服务接口。
Ribbon是一款实现服务负载均衡的开源软件, 服务的消费用Ribbon来完成
引入依赖
<dependencies>
<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-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>
</dependencies>
配置启动类
配置一个RestTemplate Bean,然后加上@LoadBalanced注解来开启负载均衡,RestTemplate 是一个HTTP请求工具,它提供了常见的REST请求方案的模版。
@EnableDiscoveryClient//开启发现服务和注册服务
@SpringBootApplication
public class DemoApplication {
@Bean
@LoadBalanced
RestTemplate restTemplate() {
return new RestTemplate();
}
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
执行测试
注入RestTemplate,使用该对象均衡的去获取服务并消费。使用服务名称去获取服务,而不是使用传统的IP、端口的形式,只要保证服务名称不变即可,IP和端口不是关心重点。
@RestController
public class TestController {
@Autowired
private RestTemplate restTemplate;
@GetMapping("/getInfo")
public String getInfo() {
return this.restTemplate.getForEntity("http://eureka-client1/getInfo", String.class).getBody();
}
}
五、Eureka-Server认证
出于安全考虑,会对Eureka服务端添加用户认证的功能。
添加依赖
在Eureka-Server引入Spring-Security依赖
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
</dependencies>
配置用户名和密码
security:
user:
name: admin
password: admin
修改Eureka服务地址
Eureka服务端配置了密码之后,所有eureka.client.serviceUrl.defaultZone的配置也必须配置上用户名和密码
格式为:
eureka.client.serviceUrl.defaultZone=http://${userName}:${password}@${hosetname}:${port}/eureka/
eureka:
instance:
hostname: localhost
client:
serviceUrl:
defaultZone: http://admin:admin123@localhost:8080/eureka/
执行测试
重启项目后,登录发现无服务注册成功,客户端控制台报错: com.netflix.discovery.shared.transport.TransportException: Cannot execute request on any known server
security默认开启csrf,在Eureka 服务端添加配置,关闭csrf
@EnableWebSecurity
@Configuration
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
// 方案一
http.csrf().disable(); // 关闭csrf
http.authorizeRequests().anyRequest().authenticated().and().httpBasic(); // 开启认证
// 方案二
// http.csrf().ignoringAntMatchers("/eureka/**");
// super.configure(http);
}
}
六、Eureka配置参数说明
配置 | 含义 | 默认值 |
---|---|---|
eureka.client.enabled | 是否启用Eureka Client | true |
eureka.client.register-with-eureka | 表示是否将自己注册到Eureka Server | true |
eureka.client.fetch-registry | 表示是否从Eureka Server获取注册的服务信息 | true |
eureka.client.serviceUrl.defaultZone | 配置Eureka Server地址,用于注册服务和获取服务 | http://localhost:8761/eureka |
eureka.client.registry-fetch-interval-seconds | 默认值为30秒,即每30秒去Eureka Server上获取服务并缓存 | 30 |
eureka.instance.lease-renewal-interval-in-seconds | 向Eureka Server发送心跳的间隔时间,单位为秒,用于服务续约 | 30 |
eureka.instance.lease-expiration-duration-in-seconds | 定义服务失效时间,即Eureka Server检测到Eureka Client木有心跳后(客户端意外下线)多少秒将其剔除 | 90 |
eureka.server.enable-self-preservation | 用于开启Eureka Server自我保护功能 true | |
eureka.client.instance-info-replication-interval-seconds | 更新实例信息的变化到Eureka服务端的间隔时间,单位为秒 | 30 |
eureka.client.eureka-service-url-poll-interval-seconds | 轮询Eureka服务端地址更改的间隔时间,单位为秒。 | 300 |
eureka.instance.prefer-ip-address | 表示使用IP进行配置为不是域名 | false |
eureka.client.healthcheck.enabled | 默认Erueka Server是通过心跳来检测Eureka Client的健康状况的,通过置为true改变Eeureka Server对客户端健康检测的方式,改用Actuator的/health端点来检测。 | false |
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/137047.html