微服务---Eureka注册中心

目录

一、服务中的提供者与消费者

二、Eureka工作流程

三、搭建Eureka服务

四、服务拉取

五、总结

        1.搭建EurekaServer

        2.服务注册

        3.服务发现


一、服务中的提供者与消费者

        服务提供者:一次业务中,被其他微服务调用的服务。即提供接口给其他微服务。

        服务消费者:一次业务中,调用其他微服务的服务。即调用其他微服务提供的接口。

二、Eureka工作流程

        我们在服务调用会出现一些问题,比如服务消费者该如何获取服务提供者的地址信息?如果有多个服务提供者,消费者该如何选择?消费者如何得知服务提供者的健康状态?

        Eureka的工作流程:

        Eureka分为服务端和客户端,服务端主要是用作注册中心,客户端用于放置服务消费者和服务提供者。

        首先,Eureka注册中心首先将服务端的所有服务提供者和服务消费者注册并记录起来,但是会根据类型进行区分,这一步就是完成了登记注册功能。

        第二步,服务消费者要想调用服务提供者提供的接口,就要先访问注册中心,从注册中心中拉取所有的服务提供者然后通过负载均衡选择一个服务提供者,然后就要进行远程调用服务提供者的接口。

        那么,消费者如何得知服务提供者的健康状态?

        其实,服务提供者会对注册中心进行心跳续约的策略,要是有某些时间注册中心接受不到服务提供者的心跳提示,即他不存活了,就可以判断其已死亡,一次删除其记录,服务消费者也不会再查询到。

        消费者该如何获取服务提供者具体信息?
                服务提供者启动时向eureka注册自己的信息,eureka保存这些信息,消费者根据服务名称向eureka拉取提供者信息

        如果有多个服务提供者,消费者该如何选择?
                服务消费者利用负载均衡算法,从服务列表中挑选一个消费者

        如何感知服务提供者健康状态?
                服务提供者会每隔30秒向EurekaServer发送心跳请求,报告健康状态,eureka会更新记录服务列表信息,心跳不正常会被剔除,消费者就可以拉取到最新的信息。

三、搭建Eureka服务

        首先,我们创建一个普通Javamaven项目,作为父工程:

        可以将创建好的项目中的src目录删除,因为我们并不会在在父工程中编写代码逻辑,只作为父工程处理。

    

        然后在父工程中创建新模块(springboot):

        相同思路,创建一个order-service和eureka-server(这个选依赖的时候,选择Eureka Server)。

        创建后的项目目录:

       依赖信息:

        在eureka-server的启动类上加上注解:

        在eureka-server中创建资源文件夹,并配置application.yaml:

server:port: 12211 #端口号
spring:application:name: eurekaserver #eureka的服务名称
eureka:service-url: #eureka的地址信息defaultZone: http://localhost:12211/eurekaclient:register-with-eureka: false # 表示不向注册中心注册fetch-registry: false # 由于注册中心的职责就是维护服务实例,所以它不需要去检索服务

        启动启动类,并访问地址:localhost:12211

        从上面的红色区域,我们就能看到,注册到eureka中的配置。

        对于eureka-server的配置:我们总体就有三个步骤:

        1.引入依赖。2.加注解。3.配置文件。

        接下来,我们进行注册user-service和order-service:

        两个步骤操作一样,因此,只展示其中一个:

        引入依赖:

        <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>

        配置application.yaml:

server:port: 8081 #端口号
spring:application:name: orderservice #eureka的服务名称
eureka:client:service-url: #eureka的地址信息defaultZone: http://localhost:12211/eureka

        然后启动即可:

        再次访问:

        注册的实例都已经配置上了

        另外,我们可以将user-service多次启动,模拟多实例部署,但为了避免端口冲突,需要修改端口设置:

四、服务拉取

        基于上述配置,我们通过order-service通过调用user-service来完成获取用户信息的功能。

        首先,在order-service的启动类中加上一个bean,加上@LoadBlanced用于指示负载均衡:

    @Bean@LoadBalancedpublic RestTemplate restTemplate(){return new RestTemplate();}

        然后我们在order-service中配置一个controller:

package com.order.orderservice.controller;import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;import javax.annotation.Resource;@RestController
public class MyController {@Resourceprivate RestTemplate restTemplate;@RequestMapping("/getOrder")@ResponseBodypublic String getOrder(){String url="http://userservice/getUser";String s = restTemplate.getForObject(url, String.class);return "成功得到用户"+s;}
}

        在application.yaml中添加配置:

server:port: 8081 #端口号
spring:application:name: orderservice #eureka的服务名称
eureka:client:service-url: #eureka的地址信息defaultZone: http://localhost:12211/eureka
http:maxTotal: 100         #最大连接数defaultMaxPerRoute: 20  #并发数connectTimeout: 1000   #创建连接的最长时间connectionRequestTimeout: 500  #从连接池中获取到连接的最长时间socketTimeout: 10000 #数据传输的最长时间staleConnectionCheckEnabled: true  #提交请求前测试连接是否可用validateAfterInactivity: 3000000   #可用空闲连接过期时间,重用空闲连接时会先检查是否空闲时间超过这个时间,如果超过,释放socket重新建立

        再在user-service中写一个controller和对应的方法:

package com.user.userservice.controller;import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;@RestController
public class UserController {@RequestMapping("/getUser")@ResponseBodypublic String getUser(){return "张三";}
}

        通过调用order-service中的请求,order-service再通过注册中心请求user-service中的相关内容,即可获取。

        心细的人就会发现,我们写URL的时候并没有指明端口号,而是给出的服务名称,因为这些服务都是注册到注册中心的,因此,我们可以直接用名称来代替。

五、总结

        1.搭建EurekaServer

                引入eureka-server依赖

                添加@EnableEurekaServer注解

                在application.yml中配置eureka地址


        2.服务注册

                引入eureka-client依赖

                在application.yml中配置eureka地址


        3.服务发现


                引入eureka-client依赖

                在application.yml中配置eureka地址

                给RestTemplate添加@LoadBalanced注解

                用服务提供者的服务名称远程调用

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/527136.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

<Linux> 初识线程

目录 前言&#xff1a; 一、什么是线程 &#xff08;一&#xff09;基本概念 &#xff08;二&#xff09;线程理解 &#xff08;三&#xff09;线程与进程的关系 &#xff08;四&#xff09;简单实用线程 &#xff08;五&#xff09;重谈虚拟地址空间 1. 页表的大小 2…

编码器-解码器模型(Encoder-Decoder)

注意&#xff1a;本文引用自专业人工智能社区Venus AI 更多AI知识请参考原站 &#xff08;[www.aideeplearning.cn]&#xff09; 编码器-解码器模型简介 Encoder-Decoder算法是一种深度学习模型结构&#xff0c;广泛应用于自然语言处理&#xff08;NLP&#xff09;、图像处理…

数组:初始化,访问某一个,遍历

文章目录 静态初始化数组数组的访问&#xff1a;遍历数组案例 动态初始化数组总结案例 静态初始化数组 定义数组的时候直接给数组赋值。 简化格式&#xff1a; int[] ages {12,52,96}; 完整格式&#xff1a; int[] ages new int[]{12,16,26};数组变量名中存储的是数组在内存…

数据结构奇妙旅程之二叉平衡树

꒰˃͈꒵˂͈꒱ write in front ꒰˃͈꒵˂͈꒱ ʕ̯•͡˔•̯᷅ʔ大家好&#xff0c;我是xiaoxie.希望你看完之后,有不足之处请多多谅解&#xff0c;让我们一起共同进步૮₍❀ᴗ͈ . ᴗ͈ აxiaoxieʕ̯•͡˔•̯᷅ʔ—CSDN博客 本文由xiaoxieʕ̯•͡˔•̯᷅ʔ 原创 CSDN …

Dubbo-记录

1.概念 Apache Dubbo 是一款 RPC 服务开发框架&#xff0c;用于解决微服务架构下的服务治理与通信问题&#xff0c;官方提供了 Java、Golang 等多语言 SDK 实现。使用 Dubbo 开发的微服务原生具备相互之间的远程地址发现与通信能力&#xff0c; 利用 Dubbo 提供的丰富服务治理…

Linux最小系统安装无法查看IP地址

1&#xff0c;出现原因 服务器重启完成之后&#xff0c;我们可以通过linux的指令 ip addr 来查询Linux系统的IP地址&#xff0c;具体信息如下: 从图中我们可以看到&#xff0c;并没有获取到linux系统的IP地址&#xff0c;这是为什么呢&#xff1f;这是由于启动服务器时未加载网…

Decontam去污染:一个尝试

为了程序运行的便利性&#xff0c;不想将Decontam放到windows的Rstudio里面运行&#xff0c;需要直接在Ubuntu中运行&#xff0c;并且为了在Decontam时进行其他操作&#xff0c;使用python去运行R 首先你需要有一个conda环境&#xff0c;安装了R&#xff0c;Decontam&#xff0…

【b站咸虾米】1 Vue介绍 2021最新Vue从基础到实例高级_vue2_vuecli脚手架博客案例

课程地址&#xff1a;【2021最新Vue从基础到实例高级_vue2_vuecli脚手架博客案例】 https://www.bilibili.com/video/BV1pz4y1S7bC/?share_sourcecopy_web&vd_sourceb1cb921b73fe3808550eaf2224d1c155 感觉尚硅谷的Vue看完忘得差不多了&#xff0c;且之前学过咸虾米的unia…

使用css结合js实现html文件中的双行混排

此前写过一个使用flex布局实现html文件中的双行混排&#xff0c;但是感觉效果不佳。经过几天思考&#xff0c;我认为双行混排的要点其实是两个&#xff1a; 1、正文和批注的文字大小不同&#xff1b; 2、正文和批注的行距相互配合进行设定。 正文和批注的文字大小及行距都可…

【Python】进阶学习:OpenCV--一文详解cv2.namedWindow()

【Python】进阶学习&#xff1a;OpenCV–一文详解cv2.namedWindow() &#x1f308; 个人主页&#xff1a;高斯小哥 &#x1f525; 高质量专栏&#xff1a;Matplotlib之旅&#xff1a;零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程&#x1f448; 希望…

【JavaEE初阶 -- 多线程】

认识线程&#xff08;Thread&#xff09;Thread类及常见方法 1.认识线程&#xff08;Thread&#xff09;1.1 线程1.2 进程和线程的关系和区别1.3 Java的线程和操作系统线程的关系1.4 创建线程 2. Thread类及常用的方法2.1 Thread的常见构造方法2.2 Thread的几个常见属性2.3 启动…

enumerate函数的用法

enumerate() 函数是 Python 内置函数之一&#xff0c;用于同时返回可迭代对象的索引和对应的值。 它的语法结构如下&#xff1a; enumerate(iterable, start0) iterable: 表示一个可迭代的对象&#xff0c;如列表、元组、字符串等。start: 可选参数&#xff0c;表示索引起始…