【微服务】SpringCloud-eureka光速入门

SpringCloud-eureka光速入门

[一、Eureka 主要组件](#一、Eureka 主要组件)

二、工作流程

三、优势

四、Eureka-光速入门【重点】

[4.1 案例准备](#4.1 案例准备)

[4.1.1 创建父工程 tingyi-shop](#4.1.1 创建父工程 tingyi-shop)

[4.1.2 创建子工程 tingyi-goods](#4.1.2 创建子工程 tingyi-goods)

[4.1.3 创建子工程 tingyi-order](#4.1.3 创建子工程 tingyi-order)

[4.1.4 案例调整](#4.1.4 案例调整)

[4.1.4.1 在order模块创建 RestTemplate对象](#4.1.4.1 在order模块创建 RestTemplate对象)

[4.1.4.2 修改OrderController](#4.1.4.2 修改OrderController)

[4.1.4.2 重启并测试](#4.1.4.2 重启并测试)

[4.2 为什么使用eureka](#4.2 为什么使用eureka)

[4.2 Eureka光速入门](#4.2 Eureka光速入门)

[4.2.1 创建EurekaServer](#4.2.1 创建EurekaServer)

[4.2.2 调整商品模块](#4.2.2 调整商品模块)

[4.2.3 调整订单模块](#4.2.3 调整订单模块)

[4.2.4 调整订单模块, 调用商品模块](#4.2.4 调整订单模块, 调用商品模块)

[4.2.4 测试](#4.2.4 测试)

[4.3 Eureka的安全性](#4.3 Eureka的安全性)

[4.4 Eureka的高可用](#4.4 Eureka的高可用)

[4.4.1 配置以及代码](#4.4.1 配置以及代码)

[4.4.2 测试](#4.4.2 测试)

[4.4.3 Eureka的细节](#4.4.3 Eureka的细节)


|---------------------|
| 🎈边走、边悟🎈迟早会好 |

Eureka 是 Netflix 开源的一个服务注册和发现工具,主要用于构建分布式系统中的服务发现机制。它在 Spring Cloud 生态系统中广泛使用,尤其在微服务架构中扮演重要角色。

一、Eureka 主要组件

  1. Eureka Server:

    • 作为服务注册中心,负责管理服务实例的注册和心跳检测。
    • 服务实例在启动时向 Eureka Server 注册,并定期发送心跳以保持注册信息的有效性。
    • Eureka Server 通常部署为集群,确保高可用性和容错性。
  2. Eureka Client:

    • 是注册在 Eureka Server 上的服务实例。
    • 它可以是任何类型的微服务应用程序,在启动时向 Eureka Server 注册并定期发送心跳。
    • Eureka Client 也可以从 Eureka Server 获取其他已注册服务的信息,以实现服务间的调用和负载均衡。

二、工作流程

  1. 服务注册:

    • 服务实例在启动时向 Eureka Server 注册其自身的元数据信息,如 IP 地址、端口号、服务名称等。
  2. 服务心跳:

    • 注册后,服务实例定期向 Eureka Server 发送心跳请求,以表明其仍然活跃。若在一段时间内未收到心跳,Eureka Server 将认为该实例已失效,并将其从注册列表中移除。
  3. 服务发现:

    • 服务调用者(客户端)通过 Eureka Server 查询可用的服务实例列表,以实现服务调用。
    • Eureka Client 缓存这些信息,并定期从 Eureka Server 更新,确保负载均衡和高可用性。
  4. 负载均衡:

    • 客户端根据从 Eureka Server 获取的服务实例列表,实现客户端负载均衡。
    • 常见的负载均衡策略包括轮询、随机选择、加权轮询等。

三、优势

  • 高可用性: Eureka Server 支持集群部署,确保在某些节点故障时系统仍然可用。
  • 自我保护机制: 当 Eureka Server 检测到大量客户端失效时,进入自我保护模式,避免因网络分区等原因误判服务失效。
  • 易扩展性: 新的服务实例可以动态注册和发现,支持弹性扩展。

Eureka 在 Netflix 的微服务架构中得到了广泛应用,并成为 Spring Cloud 的核心组件之一,用于实现服务注册与发现。

四、Eureka-光速入门【重点

4.1 案例准备

4.1.1 创建父工程 tingyi-shop

pom.xml

java 复制代码
<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

java 复制代码
<dependencies>
    <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
  </dependency>
</dependencies>

引导类

复制代码
java 复制代码
@SpringBootApplication
public class GoodsApplication {
​
    public static void main(String[] args) {
        SpringApplication.run(GoodsApplication.class, args);
    }
}

application.yml

java 复制代码
server:
  port: 9001
#指定服务的名称
spring:
  application:
    name: TINGYI-GOODS

controller编写

java 复制代码
@RestController
public class GoodsController {
​
    @RequestMapping("/query")
    public String query() {
        return "查询商品信息!";
    }
}

启动并查看效果

4.1.3 创建子工程 tingyi-order

pom.xml

java 复制代码
<dependencies>
    <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
  </dependency>
</dependencies>

引导类

java 复制代码
@SpringBootApplication
public class OrderApplication {
​
    public static void main(String[] args) {
        SpringApplication.run(OrderApplication.class,args);
    }
​
}
java 复制代码
application.yml

server:
  port: 9002
#指定服务的名称
spring:
  application:
    name: TINGYI-ORDER
复制代码

编写controller

java 复制代码
@RestController
public class OrderController {
    @RequestMapping("/query")
    public String query(){
        return "查询订单";
    }
}

启动并查看效果

4.1.4 案例调整

​ 在查询订单时,同时也需要获取商品的信息,那么我们如何查询商品信息呢?

​ 我们可以通过spring为我们提供的RestTemplate 模板对象 远程调用商品模块中的 控制器。

4.1.4.1 在order模块创建 RestTemplate对象
java 复制代码
@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
导入依赖

java 复制代码
<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>

启动类添加注解

java 复制代码
@SpringBootApplication
@EnableEurekaServer
public class EurekaApplication {
​
    public static void main(String[] args) {
        SpringApplication.run(EurekaApplication.class,args);
    }
​
}

编写yml配置文件

java 复制代码
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 调整商品模块

导入依赖

java 复制代码
<dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
  <version>2.2.2.RELEASE</version>
</dependency>

在启动类上添加注解

java 复制代码
@SpringBootApplication
@EnableEurekaClient
public class GoodsApplication {
​
    public static void main(String[] args) {
        SpringApplication.run(GoodsApplication.class,args);
    }
​
}

在配置文件中添加如下代码

java 复制代码
# 指定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 调整订单模块

导入依赖

java 复制代码
<dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
  <version>2.2.2.RELEASE</version>
</dependency>

在启动类上添加注解

java 复制代码
@SpringBootApplication
@EnableEurekaClient
public class OrderApplication {
​
    public static void main(String[] args) {
        SpringApplication.run(OrderApplication.class,args);
    }
​
}

在配置文件中添加如下代码

java 复制代码
# 指定Eureka服务地址
eureka:
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka

重启服务,浏览器访问地址 : http://localhost:8761 浏览器下方就会出现

4.2.4 调整订单模块, 调用商品模块

远程调用 订单模块controller

java 复制代码
@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 微服务导入依赖

java 复制代码
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
</dependency>

tingyi_eureka 微服务加入配置类:

java 复制代码
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的用户名和密码:

java 复制代码
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上需要添加用户名和密码

java 复制代码
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 业务微服务配置:

java 复制代码
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 业务微服务配置:

java 复制代码
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 微服务配置

java 复制代码
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从注册表中移除

java 复制代码
eureka:
  instance:
    lease-renewal-interval-in-seconds: 30      #心跳的间隔
    lease-expiration-duration-in-seconds: 90    # 多久没发送,就认为你宕机了

EurekaClient会每隔30s去EurekaServer中去更新本地的注册表

java 复制代码
eureka:
  client:
    registry-fetch-interval-seconds: 30 # 每隔多久去更新一下本地的注册表缓存信息

Eureka的自我保护机制,统计15分钟内,如果一个服务的心跳发送比例低于85%,EurekaServer就会开启自我保护机制

  • 不会从EurekaServer中去移除长时间没有收到心跳的服务。

  • EurekaServer还是可以正常提供服务的。

  • 网络比较稳定时,EurekaServer才会开始将自己的信息被其他节点同步过去

java 复制代码
eureka:
  server:
    enable-self-preservation: true  # 开启自我保护机制, 建议开发阶段设置为false, 不然服务停了, eureka中的信息还在.

🌟感谢支持 听忆.-CSDN博客

|--------------------|
| 🎈众口难调🎈从心就好 |

相关推荐
一元咖啡3 小时前
SpringCloud Gateway转发请求到同一个服务的不同端口
spring·spring cloud·gateway
天天扭码4 小时前
五天SpringCloud计划——DAY2之单体架构和微服务架构的选择和转换原则
java·spring cloud·微服务·架构
凡人的AI工具箱4 小时前
15分钟学 Go 第 60 天 :综合项目展示 - 构建微服务电商平台(完整示例25000字)
开发语言·后端·微服务·架构·golang
跳跳的向阳花5 小时前
03-03、SpringCloud第三章,负载均衡Ribbon和Feign
spring cloud·ribbon·负载均衡
运维&陈同学5 小时前
【zookeeper01】消息队列与微服务之zookeeper工作原理
运维·分布式·微服务·zookeeper·云原生·架构·消息队列
inter_peng19 小时前
[Docker-显示所有容器IP] 显示docker-compose.yml中所有容器IP的方法
tcp/ip·docker·eureka
码上有前20 小时前
解析后端框架学习:从单体应用到微服务架构的进阶之路
学习·微服务·架构
天天扭码20 小时前
五天SpringCloud计划——DAY1之mybatis-plus的使用
java·spring cloud·mybatis
gjh12081 天前
什么是微服务?
微服务