SpringCloud-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 主要组件
- 
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
            
            
              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-GOODScontroller编写
            
            
              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/eureka4.4 Eureka的高可用
如果程序的正在运行,突然Eureka宕机了。
如果调用方访问过一次被调用方了,Eureka的宕机不会影响到功能。
如果调用方没有访问过被调用方,Eureka的宕机就会造成当前功能不可用。
搭建Eureka高可用
准备多台Eureka
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博客

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