网站链接: element-ui dtcms
当前位置: 首页 > 技术博文  > 技术博文

注册中心及其搭建

2021/6/26 1:27:02 人评论

注册中心 服务注册是为了解决Who are you这个问题,即获取所有服务节点的身份信息和服务名称,从注册中心的角度来说我们有以下两种比较直观的解决方案: 三顾茅庐 由注册中心主动访问网络节点中所有机器 等待戈多 注册中心坐等服务节点上门注册 大家来思考…

注册中心

服务注册是为了解决Who are you这个问题,即获取所有服务节点的身份信息和服务名称,从注册中心的角度来说我们有以下两种比较直观的解决方案:
三顾茅庐 由注册中心主动访问网络节点中所有机器
等待戈多 注册中心坐等服务节点上门注册
大家来思考一个问题,为什么目前主流的注册中心都选择第二种方案,而不是第一种呢?那我们先来看看三顾茅庐的方式有哪些弊端
模型复杂:网络环境浩如烟海,轮询每个节点的做法通常是注册中心发局域网广播,客户端响应的方式,这种方式就像你对着全世界喊我爱你,顿时感到有种无力感。现实中对于跨局域网的分布式系统来说,响应模型更加复杂
网络消耗大: 整个网络环境里会掺杂大量非服务节点,这些节点无需对送达的广播请求做出响应,这种广播的模式无疑增加了网络通信成本。
服务端压力增加: 不仅要求注册中心向网络中所有节点主动发送广播请求,还需要对客户端的应答做出响应,一个担子两头挑。考虑到注册中心的节点数远远少于服务节点,我们要尽可能地减轻服务中心承载的业务。
那么对于Eureka来说,他又会选择哪种服务注册方式是呢?

等待戈多

等待戈多是爱尔兰现代主义剧作家Samuel Beckett创作的荒诞派戏剧,整场戏只有两幕,两个流浪汉驻足在同一棵树下做一件事“等待戈多”,他们对戈多一无所知,戈多是谁?戈多住在哪里?戈多现在情况怎样?这些问题都没有答案,只有在戈多到来之后才能一一揭晓。
Eureka的服务注册就采用了这样一种“等待戈多”的注册模式。注册中心就像这棵老树下的流浪汉,我们的服务节点就像一个个的“戈多先生”。流浪汉不去搅扰其他的“哥多”、“哥少”先生,只静静等待那些真正的“戈多”来到他们面前,听戈多讲述自己的故事。
要说这种模式带来的好处那是相当的多
省心 对于网络中其它非服务节点来说不会产生任何无效请求
省时 省去了广播环节的时间,使注册效率大大提高
省力 节省了大量网络请求的开销
大家通过后面的学习会发现,不仅在服务注册方面,在其他服务治理的环节中,SpringCloud对注册中心可谓是优待有加,只接受服务节点上门服务,绝不主动出门联系。这便是SpringCloud大道至简的智慧所在,任何复杂的问题到了这里,都会通过最简单、最经济的方式来解决。
同学们你们一定还有个疑问,为什么我不使用守株待兔这个比喻,而使用等待戈多?那是因为后面一个高端大气上档次啊

注册中心的日常任务

当我期盼的戈多到来了以后,他会告诉关于他的三件事情
他会的技能(所提供的微服务是什么,比如“洗剪吹”)
他住在哪里(IP地址+端口)
他的状态(通常注册完成时的服务状态就是UP)
在等待戈多的过程中,其实这两位流浪汉也没有那么闲,他在空余时间还是干了两件微小的事:
心跳检测和服务剔除 已经注册过的戈多们,会时不时来跟我打声招呼(心跳检测),如果隔段时间没见着他们了,我就只好从注册名单中把他们删除(服务剔除)。
注册信息同步 我们两个流浪汉分别接待不同的戈多,有的戈多在我这里注册,没有在他那里注册。我抽空就会把我这里的戈多名单和他做分享。

戈多报道指南

在茫茫世界中游荡的戈多,是如何找到流浪汉去报道的呢?当然是靠着我们开发人员作为上帝视角预先告诉了他们流浪汉的地址,这个地址包含了三个维度的信息,分别是Region, Zone和URL。
Region代表地理上的分区,而Zone则是这个分区下的机房。大多数情况下我们的配置中心只存在一个机房,这时配置URL就好了(比如
http://localhost:20000/eureka/
),这是注册中心的IP地址,同时Eureka会为我们指定一个默认的Region和Zone。

某些情况下当开发人员主动指定了注册中心的region和zone,比如在多机房的网络环境中,我给上海机房的注册中心指定了region=east_china, zone=sh,这时候服务节点的配置文件就会有一些不同了,在稍后的demo中会讲到。
知道了地址以后,戈多也要准备下见了面告诉流浪汉什么,那就是:
我会提供什么服务 spring.application.name=xijianchui
我住在哪里 - 物理地址如localhost:10000。
还有很多絮絮叨叨的琐事,比如instanceId,leaseInfo以及等等,大家就一看而过吧

搭建注册中心

创建服务注册中心

  • 创建Demo顶层pom和子项目eureka-server
  • 添加Eureka依赖
  • 设置启动类
  • Start走起

先在父pom.xml
在这里插入图片描述

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.imooc</groupId>
    <artifactId>spring-cloud-demo</artifactId>
    <packaging>pom</packaging>
    <version>1.0.0-SNAPSHOT</version>
    <modules>
        <module>eureka/eureka-server</module>
        <module>eureka/eureka-client</module>
        <module>eureka/eureka-consumer</module>
        <module>eureka/eureka-server-peer</module>
        <module>eureka/eureka-server-peer2</module>
    </modules>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Greenwich.SR1</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>

            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-parent</artifactId>
                <version>2.1.5.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <dependencies>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.8</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.6.0</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                    <encoding>UTF-8</encoding>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>

eurka-client的pom.xml
在这里插入图片描述

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>spring-cloud-demo</artifactId>
        <groupId>com.imooc</groupId>
        <version>1.0.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>
    <packaging>jar</packaging>
    <artifactId>eureka-client</artifactId>
    <name>eureka-client</name>

    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    </dependencies>

</project>

启动配置
在这里插入图片描述

package com.imooc.springcloud;

import org.springframework.boot.WebApplicationType;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

/**
 * Created by 半仙.
 */
@SpringBootApplication
@EnableDiscoveryClient
public class EurekaClientApplication {

    public static void main(String[] args) {

        new SpringApplicationBuilder(EurekaClientApplication.class)
                .web(WebApplicationType.SERVLET)
                .run(args);
    }

}

properties
在这里插入图片描述

spring.application.name=eureka-client

server.port=30002

eureka.client.serviceUrl.defaultZone=http://localhost:20000/eureka/

#eureka.client.serviceUrl.defaultZone=http://peer2:20000/eureka/,http://peer1:20001/eureka/

# 每隔5秒钟,向服务中心发送一条续约指令
#eureka.instance.lease-renewal-interval-in-seconds=5

# 如果30秒内,依然没有收到续约请求,判定服务过期(上西天)
#eureka.instance.lease-expiration-duration-in-seconds=30


相关资讯

    暂无相关的数据...

共有条评论 网友评论

验证码: 看不清楚?