2.注册中心eureka

微服务的注册中心

注册中心可以说是微服务架构中的”通讯录“,它记录了服务和服务地址的映射关系。在分布式架构中,
服务会注册到这里,当服务需要调用其它服务时,就这里找到服务的地址,进行调用。

注册中心的主要作用

服务注册中心(下称注册中心)是微服务架构非常重要的一个组件,在微服务架构里主要起到了协调者
的一个作用。注册中心一般包含如下几个功能:
1. 服务发现:
服务注册/反注册:保存服务提供者和服务调用者的信息
服务订阅/取消订阅:服务调用者订阅服务提供者的信息,最好有实时推送的功能
服务路由(可选):具有筛选整合服务提供者的能力。
2. 服务配置:
配置订阅:服务提供者和服务调用者订阅微服务相关的配置
配置下发:主动将配置推送给服务提供者和服务调用者
3. 服务健康检测
检测服务提供者的健康情况

常见的注册中心

Zookeeper
zookeeper它是一个分布式服务框架,是Apache Hadoop 的一个子项目,它主要是用来解决分布式应
用中经常遇到的一些数据管理问题,如:统一命名服务、状态同步服务、集群管理、分布式应用配置项
的管理等。简单来说zookeeper=文件系统+监听通知机制。
Eureka
Eureka是在Java语言上,基于Restful Api开发的服务注册与发现组件,Springcloud Netflflix中的重要组
Consul
Consul是由HashiCorp基于Go语言开发的支持多数据中心分布式高可用的服务发布和注册服务软件,
采用Raft算法保证服务的一致性,且支持健康检查。
Nacos
Nacos是一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。简单来说 Nacos 就是
注册中心 + 配置中心的组合,提供简单易用的特性集,帮助我们解决微服务开发必会涉及到的服务注册
与发现,服务配置,服务管理等问题。Nacos 还是 Spring Cloud Alibaba 组件之一,负责服务注册与
发现。
最后我们通过一张表格大致了解Eureka、Consul、Zookeeper的异同点。选择什么类型的服务注册与
发现组件可以根据自身项目要求决定

Eureka的概述

Eureka的基础知识

Eureka是Netflflix开发的服务发现框架,SpringCloud将它集成在自己的子项目spring-cloud-netflflix中,
实现SpringCloud的服务发现功能。 

 

 搭建eurekaServer注册中心

1.创建一个子模块:

(2) 引入maven坐标
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
    </dependency>
(3) 配置application.yml
server:
  port: 9000  #端口
#配置eureka server
eureka:
  instance:
    hostname: localhost
  client:
    register-with-eureka: false  #是否将自己注册到注册中心(默认为true)
    fetch-registry: false  #是否要从eureka获取注册信息
    service-url:  #配置暴露给eureka Client的请求地址
      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
(4) 配置启动类
在 cn.itcast.eureka 下创建启动类 EurekaServerApplication 
@SpringBootApplication
//激活eurekaserver
@EnableEurekaServer
public class EurekaServiceApplication {
    public static void main(String[] args) {
        SpringApplication.run(EurekaServiceApplication.class,args);
    }
}

启动服务并访问localhost:9000:

服务注册到Eureka注册中心

(1) 商品模块中引入坐标
      <!--引入eurekaClient-->
      <dependency>
          <groupId>org.springframework.cloud</groupId>
          <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
      </dependency>

(2) 配置application.yml文件
在工程的 application.yml 中添加Eureka Server的主机地址 
eureka:
  client:
    service-url:
      defaultZone: http://localhost:9000/eureka/
  instance:
    prefer-ip-address: true #使用IP地址注册

(3) 修改启动类添加服务注册注解

 订单服务(oeder_service)注册

操作步骤同上

获取元数据

Eureka的元数据有两种:标准元数据和自定义元数据。
标准元数据:主机名、IP地址、端口号、状态页和健康检查等信息,这些信息都会被发布在服务注
册表中,用于服务之间的调用。
自定义元数据:可以使用eureka.instance.metadata-map配置,符合KEY/VALUE的存储格式。这
些元数据可以在远程客户端中访问。
在程序中可以使用DiscoveryClient 获取指定微服务的所有元数据信息 
package cn.itcast.order.controller;

import cn.itcast.order.entity.Product;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

import java.util.List;

@RestController
@RequestMapping("/order")
public class OrderController {
    /**
     * @param id  商品id
     * @return 通过订单服务调用商品服务根据id查询商品信息
     * 1.需要配置商品对象
     * 2.需要调用商品服务
     */
    //注入RestTemplate对象
    @Autowired
    RestTemplate restTemplate;

    @RequestMapping(value = "/buy/{id}", method = RequestMethod.GET)
    public Product findById(@PathVariable Long id) {
//        Product product = productService.findProductById(id);
        //如何调用商品服务
        /**
         * 1.使用java中的urlconnection
         * 2.httpclient
         * 3.okhttp
         * 4.spring的RestTemplate
         */
        Product product = restTemplate.getForObject("http://localhost:9001/product/findById/1", Product.class);
        return product;

    }

    /**
     * 注入DiscoveryClient
     * springCloud提供的获取元数据的工具类
     * 调用方法获取元数据信息
     */
    @Autowired
    private DiscoveryClient discoveryClient;
    @RequestMapping(value = "/buybuy/{id}", method = RequestMethod.GET)
    public Product findById2(@PathVariable Long id) {
//        调用discorveryClient方法
        //获取到所有元数据
        List<ServiceInstance> instances = discoveryClient.getInstances("service-product");
//        for (ServiceInstance instance:instances){
//            System.out.println(instance);
//        }
//        获取唯一一个元数据
        ServiceInstance instance = instances.get(0);
//        Product product = restTemplate.getForObject("http://localhost:9001/product/findById/1", Product.class);
//        根据元数据中的主机地址和端口号拼接请求商品微服务(prodect_service)的url
        Product product = restTemplate.getForObject("http://" + instance.getHost() + ":" + instance.getPort() + "/product/findById/1", Product.class);
        return product;
    }
}

Eureka中的自我保护

微服务第一次注册成功之后,每30秒会发送一次心跳将服务的实例信息注册到注册中心。通知 Eureka
Server 该实例仍然存在。如果超过90秒没有发送更新,则服务器将从注册信息中将此服务移除。
Eureka Server在运行期间,会统计心跳失败的比例在15分钟之内是否高于85%,如果出现低于的情况
(在单机调试的时候很容易满足,实际在生产环境上通常是由于网络不稳定导致),Eureka Server会
将当前的实例注册信息保护起来,同时提示这个警告。保护模式主要用于一组客户端和Eureka Server
之间存在网络分区场景下的保护。一旦进入保护模式,Eureka Server将会尝试保护其服务注册表中的
信息,不再删除服务注册表中的数据(也就是不会注销任何微服务)
验证完自我保护机制开启后,并不会马上呈现到web上,而是默认需等待 5 分钟(可以通过
eureka.server.wait-time-in-ms-when-sync-empty 配置),即 5 分钟后你会看到下面的提示信息: 

 翻译:

紧急!尤里卡可能是错误地声称实例已经启动,而实际上它们还没有启动。续费低于阈值,因此为了安全起见,实例不会过期。
如果关闭自我保护
通过设置 eureka.enableSelfPreservation=false 来关闭自我保护功能。 
eureka:
  client:
    register-with-eureka: true  #是否将自己注册到注册中心(默认为true)
    fetch-registry: true  #是否要从eureka获取注册信息
    service-url:  #配置暴露给eureka Client的请求地址
      defaultZone: http://127.0.0.1:9000/eureka/
  server:
    enable-self-preservation: false #关闭自我保护
    eviction-interval-timer-in-ms: 4000 #剔除服务的时间间隔(单位毫秒)

 

posted @ 2020-08-26 23:43  指尖下的世界  阅读(318)  评论(0编辑  收藏  举报
/* 看板娘 */ /*炸泡*/
/* 鼠标点击求赞文字特效 */