SpringCloud-eureka光速入门

一、Eureka 主要组件

二、工作流程

三、优势

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

4.1 案例准备

4.1.1 创建父工程 tingyi-shop

4.1.2 创建子工程 tingyi-goods

4.1.3 创建子工程 tingyi-order

4.1.4 案例调整

4.1.4.1 在order模块创建 RestTemplate对象

4.1.4.2 修改OrderController

4.1.4.2 重启并测试

4.2 为什么使用eureka

4.2 Eureka光速入门

4.2.1 创建EurekaServer

4.2.2 调整商品模块

4.2.3 调整订单模块

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

4.2.4 测试

4.3 Eureka的安全性

4.4 Eureka的高可用

4.4.1 配置以及代码

4.4.2 测试

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

<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博客

🎈众口难调🎈从心就好

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐