(二 什么是Eureka服务注册中心,如何搭建?)手摸手带你一起搭建 Spring cloud 微服务 理论+实践+解析

上一章 Spring cloud 理论+实践+解析 手摸手带你一起搭建(一 什么是微服务)
我们初步了解了下微服务,也简单地写了个demo,有点那个味道了。但是大家也会发现这很不方便,需要记住ip,这不是自找麻烦吗,是吧。所以今天就要讲到这个Eureka服务中心,我们来了解一下它有什么用,为什么要有它,他可以做什么?


前言

前言免了吧,不知道这里前言要逼逼什么。这里暂且不逼,想到了再逼,就当我在这里放了几个屁吧。

一、Eureka服务注册中心可能是什么样?

我比较笨,我就从字面意思看到注册两个字。注册两个字太常见了,注册QQ,注册微博,注册微信。
注册能干嘛,注册的人之间可以一起逼逼了,加个好友就可以逼逼了,拉黑就算了。可见,注册似乎能把大家连在一起。
因此现在我们暂时可以理解为Eureka注册中心就是所有服务都可以注册在一起。那么我们这边服务注册到中心,Eureka就可以拿到我们的服务的ip、端口和服务名,因此我们每个服务器都需要在yml配置文件中配置服务名和端口。
此时,我想大家脑中应该可以看到这样一张图,很明显,这样我们就可以根据服务名拿到服务的ip,然后再通过我们上一章用的RestTemplate去取别的服务了。
在这里插入图片描述

二、测试

1、拿到上一章的工程

我们的测试工程都是在原本的工程上增加。
如果你没有上一章的工程点击这里下载上一章例程
免费免费免费,我没下载过,可能需要登录。
至于工程怎么导入,我后面有空我再写一篇,贴个链接放在这里。
如果是初学者,我还是建议从头跟着做,下载多无聊,你说是不是。

2、创建服务中心的子工程

上来先给它配置成Springboot工程,这个上一章也讲过,这里就不重复了。反正就加点依赖一看秒懂。
不同之处:
引入依赖

  <!--    eureka-->
    <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
      <version>2.2.5.RELEASE</version>
    </dependency>

创建启动类
启动类添加@EnableEurekaServer注解,表示这是个服务中心,其实我第一次看哪个eureka服务中心的时候很蒙蔽额的。以为这是个软件吧,是不是得安装,肯定很麻烦吧。不是的,也就是个服务器。

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;

@SpringBootApplication
@EnableEurekaServer
public class Eureka {
    
    
    public static void main(String[] args) {
    
    
        SpringApplication.run(Eureka.class, args);
    }
}

配置文件
第一个那就是配置端口和服务器名称了
下面配置的是eureka
defaultZone 是说明注册中心的地址,如果注册中心是集群的话,这个写的是别的服务中心的地址,没事这个地方先不管,回头会再讲,只不过总得介绍一下参数,不然有点莫名其妙
register-with-eureka 是否注册到中心,因为我们现在就一台注册中心,自己也不提供服务,所以就没必要自己注册自己了
fetch-registry 是否拉去服务,我们这边选择不拉取,就是个注册中心,也不用拉取服务了。

server:
  port: 11111
spring:
  application:
    name: eureka-server
eureka:
  client:
    service-url:
      defaultZone: http://127.0.0.1:11111/eureka
    register-with-eureka: false
    fetch-registry: false

运行
这个时候运行起来,然后打开浏览器输入 127.0.0.1:11111 也就是注册中心地址
在这里插入图片描述

3、修改生产者工程user-service

将user-service注册到eureka中心
添加依赖
注册中心我们是添加了eureka-server的依赖
需要去注册的我们添加的就是eureka-client的依赖

 <!--    eureka-->
    <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
      <version>2.2.5.RELEASE</version>
    </dependency>

添加配置
可以看到这里添加的几个配置和eureka中心的配置项是一样的,只不过配置的不一样。
拉取服务和是否注册都选了是,因为这是个服务肯定要注册到中心,且有需要服务的时候,所以要拉取服务,其实这两个配置项默认就是true,因此也可以不写。

server:
  port: 1001
spring:
  application:
    name: user-service
eureka:
  client:
    service-url:
      defaultZone: http://127.0.0.1:11111/eureka
    register-with-eureka: true
    fetch-registry: true

启动类添加注解
@EnableEurekaClient

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;

@SpringBootApplication
@EnableEurekaClient
public class UserService {
    
    
    public static void main(String[] args) {
    
    
        SpringApplication.run(UserService.class, args);
    }
}

在启动完注册中心后启动user-service工程,再打开浏览器输入 127.0.0.1:11111
此时你可以看到有服务注册上来了
在这里插入图片描述

4、修改消费者工程custom-service

消费者工程注册到eureka中心,且修改RestTemplate的请求路径为通过服务名拉取服务。
首先呢也是先把服务注册,注册的步骤和生产者工程相同。
同样也能够注册到eureka中心之后
我们修改Handler
在这里,使用DiscoveryClient工具类,通过服务名获取服务集合,拿到服务就可以获取到路径和端口,拼接成url,也同样可以访问到user-service


import org.antry.service.UserService;
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.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

import java.util.List;

/**
 * @ClassName UserHandler
 * @Description TODO
 * @Autor T_Antry
 * @Date 2020/11/11 11:32
 * @Version 1.0
 */
@RestController
@RequestMapping("user")
public class UserHandler {
    
    
    @Autowired
    private RestTemplate restTemplate;
    @Autowired
    private UserService userService;
    @Autowired
    private DiscoveryClient discoveryClient;
    @GetMapping("/{id}")
    public String doGet(@PathVariable Long id){
    
    
//       String url = "http://127.0.0.1:1001/user/"+id;
//       return "<div><h1>custom-Service回应:</h1><div>"+restTemplate.getForObject(url, String.class);
//       return userService.doGetUser(id);
         List<ServiceInstance> serviceInstances= discoveryClient.getInstances("user-service");
         String url = "http://"+serviceInstances.get(0).getHost()+":"+serviceInstances.get(0).getPort()+"/user/"+id;
        return "<div><h1>custom-Service[通过注册中心拉取服务]回应:</h1><div>"+restTemplate.getForObject(url, String.class);
    }
}

现在将三个工程运行起来,先运行eureka再运行user-service最后运行custom-service
我们可以再注册中心看到,两个服务注册上来
在这里插入图片描述
通过1001端口能够直接访问user-service
在这里插入图片描述
通过9001端口的custom-service就可以看到通过注册中心拉去服务返回的效果
在这里插入图片描述

三、Eureka集群

3.1为什么需要集群呢?

上面我们的实验呢是一个eureka中心,那如果这个eureka中心挂了,所有的服务都运转不了,我靠,那这个系统好垃圾啊。所以这个时候就需要一个eureka集群

3.2集群它怎么工作呢?

我们知道集群的目的之一是,一台挂了,不影响整个系统的运行。也就是说缺了你地球还会转。因此,我们假设有AB两个注册中心,不管是注册到A还是注册到B的服务,这两个中心都应该备份。同时注册中心也会告诉服务还有其他的注册中心,我死了你可以爱她
在这里插入图片描述

四、测试

根据上面的原理图,我们可以将user-service注册到一个中心,custom-service注册到另一个注册中心,两个中心相互注册。所以我们需要先克隆一个注册中心出来,并让两个中心相互注册。并且修改任意一个服务注册到另一个注册中心查看效果。

4.1copy出一个新eureka工程(eureka-server-another)

工程克隆完之后修改yml配置文件,因为之前配置的是不注册到别的注册中心,当时只有自己一个注册中心。
现在有两个,所以要把自己注册到另一台注册中心上
这个端口是22222,把自己注册到11111上

server:
  port: 22222
spring:
  application:
    name: eureka-server
eureka:
  client:
    service-url:
      defaultZone: http://127.0.0.1:11111/eureka
    register-with-eureka: true
    fetch-registry: true

4.2修改原来Eureka中心的配置文件

端口为11111,注册到22222上

server:
  port: 11111
spring:
  application:
    name: eureka-server
eureka:
  client:
    service-url:
      defaultZone: http://127.0.0.1:22222/eureka
    register-with-eureka: true
    fetch-registry: true

4.3修改原来custom-service的配置文件

原本两个服务都是注册到11111中心,现在我们将它注册到22222,看一会儿再11111中心是否能够看到它到注册信息

server:
  port: 9001
spring:
  application:
    name: custom-service
eureka:
  client:
    service-url:
      defaultZone: http://127.0.0.1:22222/eureka
    register-with-eureka: true
    fetch-registry: true

4.4运行测试

两个中心一次运行,顺序无所谓,注册中心启动成功后一次运行服务。
第一个中心启动时会报错很正常,因为它要注册到那个中心它找不到
当工程全部启动后
可以看到,有两个服务中心,且能看到两个服务注册
在这里插入图片描述
另一台注册中心也是一样的
在这里插入图片描述

访问custom-service依然能够正常找到user-service
在这里插入图片描述
此时我们停掉任意一台注册中心,服务都不会受到影响。这个操作很简单,大家那边自己试试

五、续约、获取服务列表,失效剔除、自我保护

5.1 续约

其实这部分内容也不难理解。什么是续约?为什么要续约呢?前面user-service做了注册,相当于是登陆到注册中心。假设一个user-service挂了,中心不知道,就还会有请求过来访问,这显然是不对到。
因此中心这里需要有个机制,能够让中心知道服务是否存活。因此这里就有个心跳机制,服务需要每个一段时间,告诉中心我还活着,我还能干活。中心收到就知道你还活着,没收到就知道你死了。这就是续约,也可以说是心跳。
这是可以在user-service添加到配置信息
lease-renewal-interval-in-seconds 配置服务续约间隔时间 默认 30
lease-expiration-duration-in-seconds 配置服务失效时间 默认 90

server:
  port: 1001
spring:
  application:
    name: user-service
eureka:
  client:
    service-url:
      defaultZone: http://127.0.0.1:11111/eureka
    register-with-eureka: true
    fetch-registry: true
  instance:
    lease-renewal-interval-in-seconds: 30
    lease-expiration-duration-in-seconds: 90

5.2 获取服务列表

消费者是从中心拉取服务列表到,服务列表会根据服务的状态,新增或者剔除一些服务会更新列表。因此消费服务需要及时刷新,固定间隔拉取一次服务。
这是可以在custom-service添加到配置信息
registry-fetch-interval-seconds 拉取服务列表间隔时间 默认 30

server:
  port: 9001
spring:
  application:
    name: custom-service
eureka:
  client:
    service-url:
      defaultZone: http://127.0.0.1:22222/eureka
    register-with-eureka: true
    fetch-registry: true
    registry-fetch-interval-seconds: 30

5.3 失效剔除

失效剔除指服务中心在一定到时间内没有收到续约,就认为这个服务挂了,将服务从列表中删除。
它的配置参数在eurka中心配置
eureka.server.eviction-interval-timer-in-ms 默认6000

5.4 自我保护

在运行期间会去统计心跳失败比例在 15 分钟之内是否低于 85%,如果低于 85%,Eureka Server 会将这些实例保护起来,让这些实例不会过期,但是在保护期内如果服务刚好这个服务提供者非正常下线了,此时服务消费者就会拿到一个无效的服务实例,此时会调用失败,对于这个问题需要服务消费者端要有一些容错机制,如重试,断路器等。
换句话说,就是服务有在90秒内续约,但没有每隔30秒续约一次,中心认为它网络不稳定,把它保护起来,不会让它剔除列表。
它的配置参数在eurka中心配置
eureka.server.enable-self-preservation: true

server:
  port: 22222
spring:
  application:
    name: eureka-server
eureka:
  client:
    service-url:
      defaultZone: http://127.0.0.1:11111/eureka
    register-with-eureka: true
    fetch-registry: true
  server:
    eviction-interval-timer-in-ms: 60000
    enable-self-preservation: true

这个由于效果比较不好演示,因此也是作为了解,我们要知道它有这么个东西,这么个机制。
本章例程资源
下一章:(三 Ribbon 什么是负载均衡?spring cloud如何实现负载均衡)手摸手带你一起搭建 Spring cloud 微服务 理论+实践+解析

猜你喜欢

转载自blog.csdn.net/qq_39150049/article/details/109775493