微服务 eureka_变压吸附的原理

微服务 eureka_变压吸附的原理文章目录前言一、Eureka是什么?二、Eureka是干什么的?1.服务治理三、Eureka原理解析1.总体流程2.读入数据总结前言       随着互联网技术的发展,系统用户量的增长,很多系统都采用了分布式的方式进行部署。这个固然大大提高了系统的性能和可用性,但是分布式部署导致各种服务数量大增,这给我们进行服务治理和运维带来了困扰。一、Eureka是什么?     &nbsp

大家好,又见面了,我是你们的朋友全栈君。

前言

       随着互联网技术的发展,系统用户量的增长,很多系统都采用了分布式的方式进行部署。这个固然大大提高了系统的性能和可用性,但是分布式部署导致各种服务数量大增,这给我们进行服务治理和运维带来了困扰。


一、Eureka是什么?

       Eureka是Netflix开发的服务发现框架,本身是一个基于REST的服务,主要用于定位运行在AWS域中的中间层服务,以达到负载均衡和中间层服务故障转移的目的。SpringCloud将它集成在其子项目spring-cloud-netflix中,以实现SpringCloud的服务发现功能。

二、Eureka是干什么的?

       Eureka分为Eureka客户端和Eureka服务端,Eureka客户端提供服务注册与注销、服务发现的功能,Eureka服务端提供服务治理的功能。

三、Eureka原理解析

1.服务治理流程

在这里插入图片描述
流程说明:
       (1)服务提供者集成Eureka客户端,启动时,Eureka客户端发送注册请求到Eureka服务端;
       (2)Eureka客户端每30秒发送一次续约请求到Eureka服务端;
       (3)若Eureka服务端超过90秒未收到服务提供者的续约请求,则Eureka服务端会将其从服务列表中踢除;
       (4)服务消费者集成Eureka客户端,启动时,Eureka客户端同样会发送注册请求到Eureka服务端;
       (5)服务消费者中,Eureka客户端每隔30秒,会从Eureka服务端获取服务实例列表,其中,首次是全量查询,后续为增量查询;获取到实例列表后,Eureka客户端会将其写入到本地缓存中;
       (6)服务消费者调用服务提供者时,Eureka会总本地缓存获取对应的实例,并进行接口调用。

2.Eureka高可用架构

在这里插入图片描述
       Eureka支持多机房部署的高可用架构,其中各个机房的Eureka客户端会请求本机房的Eureka服务端,而各机房的Eureka服务端则会将服务实例信息进行互相同步,保证各个Eureka服务端的实例信息都是最新的。

3.Eureka服务端缓存架构

在这里插入图片描述
       为避免读写冲突,Eureka采用多层缓存的架构。
       服务注册时,Eureka服务端会将服务实例更新到注册实例列表缓存(register)和读写缓存(readWriteCacheMap)中,然后Eureka服务端每隔30秒会将读写缓存(readWriteCacheMap)的数据更新到只读缓存(readOnlyCacheMap)中。
       消费者从Eureka服务端获取实例列表时,是直接从只读缓存(readOnlyCacheMap)中获取。

4.Eureka健康检查

       为防止因为Eureka服务器网络问题,导致大部分服务实例被踢除,Eureka在进行服务定时更新时,会进行健康检查。
       健康检查流程:当过期的服务数量比例超过阈值(可配置,默认为0.85)时,Eureka会启动自我保护机制,不会进行服务踢除操作。

5.Eureka分区

       为避免跨机房调用的网络消耗,Eureka支持通过配置实现优先使用本机房服务实例,当本机房实例不可用时,再使用其它机房的服务实例。
在这里插入图片描述

       Eureka的分区概念分为区域(region)和机房(zone)。如上图,区域(region)是北京,机房分为zone-1和zone-2。消费者(Consumer-1)调用服务时,会优先调用zone-1里面的服务提供者(Service-1),只有zone-1里面的服务提供者(Service-1)不可用,才会去调用zone-2里面的服务提供者(Service-2)。


四、Eureka实战

1.创建Eureka服务端

(1)创建名为eureka-server的maven工程

(2)引入Eureka-server依赖

<?xml version="1.0"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
	<modelVersion>4.0.0</modelVersion>
	<parent>
		<groupId>com.hxq</groupId>
		<artifactId>spring-cloud-hxq</artifactId>
		<version>0.0.1-SNAPSHOT</version>
	</parent>
	<artifactId>eureka-server</artifactId>
	<name>eureka-server</name>
	
	<properties>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
	</properties>

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

       Eureka-server依赖:spring-cloud-starter-netflix-eureka-server。

(3)创建启动类

package com.hxq;

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

/** * 注册中心 * @author Administrator * */
@SpringBootApplication
@EnableEurekaServer
public class EurekaServerApplication { 
   

    public static void main(String[] args) { 
   
        SpringApplication.run(EurekaServerApplication.class, args);
    }

}

       启动类要加上@EnableEurekaServer注解。

(4)创建application.yml配置文件

server:
    port: 8761

eureka:
    instance:
        hostname: localhost
    client:
        registerWithEureka: false
        fetchRegistry: false
    serviceUrl:
        defaultZone: http://${ 
   eureka.instance.hostname}:${ 
   server.port}/eureka/

spring:
    application:
        name: eurka-server

       配置说明:
              server.port:Eureka服务端服务端口
              eureka.instance.hostname:应用实例主机名
              eureka.client.registerWithEureka:是否向注册中心注册自己,缺省:true。一般情况下,Eureka服务端是不需要再注册自己的。
              eureka.client.fetchRegistry:是否从Eureka获取注册信息,缺省:true。一般情况下,Eureka服务端是不需要的。
              eureka.serviceUrl.defaultZone:Eureka服务器的地址,类型为HashMap,缺省的Key为 defaultZone;缺省的Value为 http://localhost:8761/eureka。如果服务注册中心为高可用集群时,多个注册中心地址以逗号分隔。
              spring.application.name:应用名称,将会显示在Eureka界面的应用名称列。

2.创建Eureka客户端

(1)创建名为service-hi的maven工程

(2)引入Eureka-client依赖

<?xml version="1.0"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
	<modelVersion>4.0.0</modelVersion>
	<parent>
		<groupId>com.hxq</groupId>
		<artifactId>spring-cloud-hxq</artifactId>
		<version>0.0.1-SNAPSHOT</version>
	</parent>

	<artifactId>service-hi</artifactId>
	<name>service-hi</name>

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

	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
		</plugins>
	</build>
</project>

       (1)Web依赖:spring-boot-starter-web;
       (2)Eureka-client依赖:spring-cloud-starter-netflix-eureka-client。

(3)创建启动类

package com.hxq;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

/** * 服务提供者 * * @author Administrator * */
@SpringBootApplication
@EnableEurekaClient
@RestController
public class ServiceHiApplication { 
   

    public static void main(String[] args) { 
   
        SpringApplication.run(ServiceHiApplication.class, args);
    }

    /** * 服务端口 */
    @Value("${server.port}")
    private String port;

    @RequestMapping("/hi")
    public String home(@RequestParam(value = "name", defaultValue = "hxq") String name) { 
   
        return "hi " + name + " ,i am from port:" + port;
    }
}

       启动类要加上@EnableEurekaClient注解。

(4)创建application.yml配置文件

server:
    port: 9100
    
spring:
    application:
        name: service-hi

eureka:
    serviceUrl:
        defaultZone: http://localhost:8761/eureka/

       配置说明:
              server.port:Eureka客户端服务端口
              spring.application.name:应用名称,将会显示在Eureka界面的应用名称列。
              eureka.serviceUrl.defaultZone:Eureka服务器的地址,类型为HashMap,缺省的Key为 defaultZone;缺省的Value为 http://localhost:8761/eureka。如果服务注册中心为高可用集群时,多个注册中心地址以逗号分隔。

3.服务验证

(1)启动eureka-server服务

在这里插入图片描述

(2)启动service-hi服务

在这里插入图片描述

(3)打开Eureka服务列表

       在浏览器中输入http://localhost:8761/打开Eureka服务列表,如下图:
在这里插入图片描述
       可以看到在实例列表中有个service-hi的应用实例。

五、微服务精通系列文章

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/125186.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • C# WPF 基础教程「建议收藏」

    本课程是《C#WPF基础教程》,对应着教材的第1章到第17章。第1章  WPF概述      1.1  Windows图形演化      1.1.1  DirectX:新的图形引擎      1.1.2  硬件加速与WPF      1.2  WPF:高级API      1.2.1  Windows窗体将继续保留      1.2.2 

    2022年4月9日
    73
  • android微信怎么建群,微信怎么建群?微信怎么建群当群主?

    android微信怎么建群,微信怎么建群?微信怎么建群当群主?【科技讯】5月12日消息,微信怎么建群,微信怎么建群当群主?微信怎么建群聊,微信建群第一次多少人?想必这些问题,已经开始成为大家在日常使用微信时经常会遇到的一个问题,今天,科技讯小编就亲自上手,为大家一一解答这些问题。微信已然成为大家日常进行社交的第一工具,虽然同属腾讯旗下产品,但是微信与QQ显然有着明显的用户群体区分,qq仍然活跃着大量的95后甚至00后的年轻人,而在他们看来,微信则是“大人”们…

    2022年5月12日
    52
  • npm 更换包源

    npm 更换包源一、前言在每一次的实际开发过程中,我们都会下载相关的依赖包,最官方的是npm,但是该服务器对于国内开发者来说,下载起来是比较慢的,所以我们需要换源。(有梯子或者信任官网的请忽略)二、cnpm:国内对npm的镜像版本/**cnpm官网地址:https://npm.taobao.org/*cnpm的大多命令跟npm的是一致的,比如安装,卸载这些*/npminstall-gcnpm–registry=https://registry.npm.taobao.org

    2025年6月8日
    4
  • 如何写cover letter 翻译自How to write a cover letter

    如何写cover letter 翻译自How to write a cover letter本文是此文章的中文翻译,有根据自己不一定正确的理解进行的改动。如何写coverletter一个好的coverletter是所提交的内容的一个重要组成部分。它并不是一个电子时代过时的古老交流方式,而应该被看作一个向编辑传达论文中的重要信息的机会。所有提交的论文(指本期刊)都要经过editorialevaluation阶段,但尽管我们都是专业的编辑,我们也不可能了解期刊内容所涵盖的每一个领域。因此,提交coverletter不仅能够帮助编辑快速地决定是否秒拒你,也能够帮…

    2022年6月11日
    31
  • (转)postMessage使用方法

    (转)postMessage使用方法postMessage使用方法

    2025年6月29日
    5
  • python的遍历字符串的方式

    python的遍历字符串的方式1)直接进行遍历strs=’abcd’forchinstrs:print(ch)2)利用下标遍历strs=’abcd’forindex,chinenumerate(strs):print(index,end=”)print(ch)3)利用range进行遍历strs=’abcd’forindexin…

    2022年6月22日
    54

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号