🎈边走、边悟🎈迟早会好
Eureka 是 Netflix 开源的一个服务注册和发现工具,主要用于构建分布式系统中的服务发现机制。它在 Spring Cloud 生态系统中广泛使用,尤其在微服务架构中扮演重要角色。
一、Eureka 主要组件
- Eureka Server:- 作为服务注册中心,负责管理服务实例的注册和心跳检测。- 服务实例在启动时向 Eureka Server 注册,并定期发送心跳以保持注册信息的有效性。- Eureka Server 通常部署为集群,确保高可用性和容错性。
- Eureka Client:- 是注册在 Eureka Server 上的服务实例。- 它可以是任何类型的微服务应用程序,在启动时向 Eureka Server 注册并定期发送心跳。- Eureka Client 也可以从 Eureka Server 获取其他已注册服务的信息,以实现服务间的调用和负载均衡。
二、工作流程
- 服务注册:- 服务实例在启动时向 Eureka Server 注册其自身的元数据信息,如 IP 地址、端口号、服务名称等。
- 服务心跳:- 注册后,服务实例定期向 Eureka Server 发送心跳请求,以表明其仍然活跃。若在一段时间内未收到心跳,Eureka Server 将认为该实例已失效,并将其从注册列表中移除。
- 服务发现:- 服务调用者(客户端)通过 Eureka Server 查询可用的服务实例列表,以实现服务调用。- Eureka Client 缓存这些信息,并定期从 Eureka Server 更新,确保负载均衡和高可用性。
- 负载均衡:- 客户端根据从 Eureka Server 获取的服务实例列表,实现客户端负载均衡。- 常见的负载均衡策略包括轮询、随机选择、加权轮询等。
三、优势
- 高可用性: Eureka Server 支持集群部署,确保在某些节点故障时系统仍然可用。
- 自我保护机制: 当 Eureka Server 检测到大量客户端失效时,进入自我保护模式,避免因网络分区等原因误判服务失效。
- 易扩展性: 新的服务实例可以动态注册和发现,支持弹性扩展。
Eureka 在 Netflix 的微服务架构中得到了广泛应用,并成为 Spring Cloud 的核心组件之一,用于实现服务注册与发现。
四、Eureka-光速入门【
重点
】
4.1 案例准备
4.1.1 创建父工程 tingyi-shop
pom.xml
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
<packaging>pom</packaging>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.8.RELEASE</version>
</parent>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<!-- 版本号是按照伦敦地铁站的名字命名的 -->
<version>Hoxton.SR4</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
4.1.2 创建子工程 tingyi-goods
pom.xml
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
引导类
@SpringBootApplication
public class GoodsApplication {
public static void main(String[] args) {
SpringApplication.run(GoodsApplication.class, args);
}
}
application.yml
server:
port: 9001
#指定服务的名称
spring:
application:
name: TINGYI-GOODS
controller编写
@RestController
public class GoodsController {
@RequestMapping("/query")
public String query() {
return "查询商品信息!";
}
}
启动并查看效果
4.1.3 创建子工程 tingyi-order
pom.xml
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
引导类
@SpringBootApplication
public class OrderApplication {
public static void main(String[] args) {
SpringApplication.run(OrderApplication.class,args);
}
}
application.yml
server:
port: 9002
#指定服务的名称
spring:
application:
name: TINGYI-ORDER
编写controller
@RestController
public class OrderController {
@RequestMapping("/query")
public String query(){
return "查询订单";
}
}
启动并查看效果
4.1.4 案例调整
在查询订单时,同时也需要获取商品的信息,那么我们如何查询商品信息呢?
我们可以通过spring为我们提供的RestTemplate 模板对象 远程调用商品模块中的 控制器。
4.1.4.1 在order模块创建 RestTemplate对象
@Configuration
public class RestTemplateConfig {
@Bean
public RestTemplate restTemplate(ClientHttpRequestFactory factory) {
return new RestTemplate(factory);
}
@Bean
public ClientHttpRequestFactory simpleClientHttpRequestFactory() {
SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory();
factory.setReadTimeout(5000);//ms
factory.setConnectTimeout(15000);//ms
return factory;
}
}
4.1.4.2 修改OrderController
4.1.4.2 重启并测试
4.2 为什么使用eureka
问题分析
如果
被调用方
,ip或者端口号发生了变化,需要维护
调用方
的方法。
如果
调用方
搭建了
集群
,需要对所有的
调用方
维护。
解决
Eureka就是帮助我们维护所有服务的信息,以便服务之间的相互调用
Eureka
4.2 Eureka光速入门
4.2.1 创建EurekaServer
创建eureka的server,创建moudle,并且导入依赖,在启动类中添加注解,编写yml文件
微服务名字可以叫做 tingyi
-eureka
导入依赖
<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-web</artifactId>
</dependency>
</dependencies>
启动类添加注解
@SpringBootApplication
@EnableEurekaServer
public class EurekaApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaApplication.class,args);
}
}
编写yml配置文件
server:
port: 8761 # 端口号
spring:
application:
name: EUREKA-SERVER
eureka:
instance:
hostname: localhost # localhost
client:
# 表示是否将自己注册到Eureka Server,默认为true
registerWithEureka: false
# 表示是否从Eureka Server获取注册信息,默认为true。
# 因为这是一个单点的Eureka Server,不需要同步其他的Eureka Server节点的数据,故而设为false
fetchRegistry: false
# 设置与Eureka Server交互的地址,查询服务和注册服务都需要依赖这个地址
serviceUrl:
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
启动 eurekaServer并访问
4.2.2 调整商品模块
导入依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
<version>2.2.2.RELEASE</version>
</dependency>
在启动类上添加注解
@SpringBootApplication
@EnableEurekaClient
public class GoodsApplication {
public static void main(String[] args) {
SpringApplication.run(GoodsApplication.class,args);
}
}
在配置文件中添加如下代码
# 指定Eureka服务地址
eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka
# Eureka服务中, 显示的当前search业务微服务的访问地址.
instance:
home-page-url: http://localhost:${server.port}
重启服务,浏览器访问地址 : http://localhost:8761
4.2.3 调整订单模块
导入依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
<version>2.2.2.RELEASE</version>
</dependency>
在启动类上添加注解
@SpringBootApplication
@EnableEurekaClient
public class OrderApplication {
public static void main(String[] args) {
SpringApplication.run(OrderApplication.class,args);
}
}
在配置文件中添加如下代码
# 指定Eureka服务地址
eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka
重启服务,浏览器访问地址 : http://localhost:8761 浏览器下方就会出现
4.2.4 调整订单模块, 调用商品模块
远程调用 订单模块controller
@RestController
public class OrderController {
@Autowired
EurekaClient eurekaClient;
//自动注入RestTemplate对象
@Autowired
RestTemplate template;
@RequestMapping("/query")
public String query(){
//根据Eureka上注册的服务名称获取实例对象
InstanceInfo instanceInfo = eurekaClient.getNextServerFromEureka("TINGYI-GOODS", false);
//获取对应模块的url
String url = instanceInfo.getHomePageUrl();
ResponseEntity<String> responseEntity = template.getForEntity(url + "/query", String.class);
//返回结果
return "查询订单" + "&" + responseEntity.getBody();
}
}
4.2.4 测试
与原来效果一致
4.3 Eureka的安全性
实现Eureka认证
tingyi_eureka
微服务导入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
tingyi_eureka
微服务加入配置类:
package com.tingyi.config;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
/**
* @author tingyi
*/
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
// 忽略掉/eureka/**
http.csrf().ignoringAntMatchers("/eureka/**");
super.configure(http);
}
}
tingyi_eureka
微服务编写配置文件, 加入Eureka的用户名和密码:
server:
port: 8761 # 端口号
spring:
application:
name: EUREKA-SERVER
# 指定Eureka的用户名和密码
security:
user:
name: root
password: root
eureka:
instance:
hostname: localhost # localhost
client:
# 表示是否将自己注册到Eureka Server,默认为true
registerWithEureka: false
# 表示是否从Eureka Server获取注册信息,默认为true。
# 因为这是一个单点的Eureka Server,不需要同步其他的Eureka Server节点的数据,故而设为false
fetchRegistry: false
# 设置与Eureka Server交互的地址,查询服务和注册服务都需要依赖这个地址
serviceUrl:
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
其他服务想注册到Eureka上需要添加用户名和密码
eureka:
client:
service-url:
defaultZone: http://用户名:密码@localhost:8761/eureka
4.4 Eureka的高可用
如果程序的正在运行,突然Eureka宕机了。
- 如果调用方访问过一次被调用方了,Eureka的宕机不会影响到功能。
- 如果调用方没有访问过被调用方,Eureka的宕机就会造成当前功能不可用。
搭建Eureka高可用
准备多台Eureka
采用了复制的方式,删除iml和target文件,并且修改pom.xml中的项目名称,再给父工程添加一个module
4.4.1 配置以及代码
让服务注册到多台Eureka, 下面是更改tingyi
_order
业务微服务配置:
server:
port: 9001
#指定服务的名称
spring:
application:
name: tingyi-order
# 指定Eureka服务地址
eureka:
client:
service-url:
defaultZone: http://root:root@EUREKA-SERVER1:8761/eureka,http://root:root@EUREKA-SERVER2:8762/eureka
让服务注册到多台Eureka, 下面是更改tingyi
_goods
业务微服务配置:
server:
port: 9002
#指定服务的名称
spring:
application:
name: tingyi-goods
# 指定Eureka服务地址
eureka:
client:
service-url:
defaultZone: http://root:root@EUREKA-SERVER1:8761/eureka,http://root:root@EUREKA-SERVER2:8762/eureka
让多台Eureka之间相互通讯, 更改 tingyi
_eureka
微服务配置
server:
port: 8761 # 端口号
spring:
application:
name: EUREKA-SERVER
security:
user:
name: root
password: root
eureka:
instance:
hostname: localhost # localhost
client:
# 表示是否将自己注册到Eureka Server,默认为true
registerWithEureka: true
# 表示是否从Eureka Server获取注册信息,默认为true。
fetchRegistry: true
# 设置与Eureka Server交互的地址,查询服务和注册服务都需要依赖这个地址
serviceUrl:
defaultZone: http://EUREKA-SERVER1:8761/eureka,http://EUREKA-SERVER2:8762/eureka/
# Eureka自我保护机制关闭, 当开启自我保护机制开启后,实例不会删除,
# 导致部分请求会连接不存在的实例,客户端没有做重试或者熔断的话会出大量问题
server:
enable-self-preservation: false
配置域名(只是用来欺骗自己的电脑)
4.4.2 测试
演示Eureka集群
- 先将 多个tingyi
_eureka
微服务启动 - 登录后,可以在任意管理页看到集群信息
4.4.3 Eureka的细节
EurekaClient启动时,将自己的信息注册到EurekaServer上,EurekaSever就会存储上EurekaClient的注册信息。
当EurekaClient调用服务时,本地没有注册信息的缓存时,去EurekaServer中去获取注册信息。
EurekaClient会通过心跳的方式去和EurekaServer进行连接。(默认30sEurekaClient会发送一次心跳请求,如果超过了90s还没有发送心跳信息的话,EurekaServer就认为你宕机了,将当前EurekaClient从注册表中移除)
eureka:
instance:
lease-renewal-interval-in-seconds: 30 #心跳的间隔
lease-expiration-duration-in-seconds: 90 # 多久没发送,就认为你宕机了
EurekaClient会每隔30s去EurekaServer中去更新本地的注册表
eureka:
client:
registry-fetch-interval-seconds: 30 # 每隔多久去更新一下本地的注册表缓存信息
Eureka的自我保护机制,统计15分钟内,如果一个服务的心跳发送比例低于85%,EurekaServer就会开启自我保护机制
- 不会从EurekaServer中去移除长时间没有收到心跳的服务。
- EurekaServer还是可以正常提供服务的。
- 网络比较稳定时,EurekaServer才会开始将自己的信息被其他节点同步过去
eureka:
server:
enable-self-preservation: true # 开启自我保护机制, 建议开发阶段设置为false, 不然服务停了, eureka中的信息还在.
🌟感谢支持 听忆.-CSDN博客
🎈众口难调🎈从心就好
版权归原作者 听忆. 所有, 如有侵权,请联系我们删除。