微服务注册中心

目录

1.微服务的注册中心

1.1 注册中⼼的主要作⽤

1.2 常⻅的注册中⼼

2.nacos简介

2.1 nacos实战⼊⻔

2.2.1 搭建nacos环境

2.2.2 将商品微服务注册到nacos

3.服务调⽤Ribbon⼊⻔

3.1 Ribbon概述

3.1.1 什么是Ribbon

3.1.2 Ribbon的主要作⽤

3.2.2 ⼯程改造

4.服务调⽤Ribbon⾼级

4.1 负载均衡概述

4.1.1 什么是负载均衡

4.2 基于Ribbon实现负载均衡

5.Nacos配置管理

5.1 统⼀配置管理

5.1.1 在nacos中添加配置⽂件

5.1.2 从微服务拉取配置

5.2 配置热更新

5.2.1.⽅式

5.3 配置共享

5.3.1 同服务内配置共享

5.3.2 不同微服务共享配置


1.微服务的注册中心

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

1.1 注册中⼼的主要作⽤

服务注册中⼼(下称注册中⼼)是微服务架构⾮常重要的⼀个组件,在微服务架构⾥主要起到了协调者 的⼀个作⽤。注册中⼼⼀般包含如下⼏个功能:

  1. 服务发现: 服务注册/反注册:保存服务提供者和服务调⽤者的信息 服务订阅/取消订阅:服务调⽤者订阅服务提供者的信息,最好有实时推送的功能 服务路由(可选):具有筛选整合服务提供者的能⼒。

  2. 服务配置: 配置订阅:服务提供者和服务调⽤者订阅微服务相关的配置 配置下发:主动将配置推送给服务提供者和服务调⽤者

  3. 服务健康检测

    检测服务提供者的健康情况

1.2 常⻅的注册中⼼

Zookeeper

zookeeper它是⼀个分布式服务框架,是Apache Hadoop 的⼀个⼦项⽬,它主要是⽤来解决分布式应 ⽤中经常遇到的⼀些数据管理问题,如:统⼀命名服务、状态同步服务、集群管理、分布式应⽤配置项 的管理等。简单来说zookeeper=⽂件系统+监听通知机制。

Eureka

Eureka是在Java语⾔上,基于Restful Api开发的服务注册与发现组件,Springcloud Netflix中的重要组 件 Consul Consul是由HashiCorp基于Go语⾔开发的⽀持多数据中⼼分布式⾼可⽤的服务发布和注册服务软件, 采 ⽤Raft算法保证服务的⼀致性,且⽀持健康检查。

Nacos

Nacos是⼀个更易于构建云原⽣应⽤的动态服务发现、配置管理和服务管理平台。简单来说 Nacos 就是 注册中⼼ + 配置中⼼的组合,提供简单易⽤的特性集,帮助我们解决微服务开发必会涉及到的服务注册 与发现,服务配置,服务管理等问题。 Nacos 还是 Spring Cloud Alibaba 组件之⼀,负责服务注册与 发现。

 

2.nacos简介

Nacos 致⼒于帮助您发现、配置和管理微服务。Nacos 提供了⼀组简单易⽤的特性集,帮助您快 速实现动态服务发现、服务配置、服务元数据及流量管理。 nacos的作⽤就是⼀个注册中⼼,⽤ 来管理注册上来的各个微服务

2.1 nacos实战⼊⻔

我们就在现有的环境中加⼊nacos,并将我们的两个微服务注册上去。

2.2.1 搭建nacos环境

第1步: 安装nacos

第2步: 启动nacos

#切换⽬录
cd nacos/bin 
#命令启动
startup.cmd -m standalone
或者直接双击
startup.cmd
运⾏

第3步: 访问nacos Plain Text 打开浏览器输⼊http://localhost:8848/nacos,即可访问服务, 默认密码是nacos/nacos

2.2.2 将商品微服务注册到nacos

开始修改 shop-product 模块的代码, 将其注册到nacos服务上

1 在pom.xml中添加nacos的依赖

        <!--nacos客户端--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency>

2 在主类上添加@EnableDiscoveryClient注解

 3 在application.yml中添加nacos服务的地址

server:port: 8081
spring:application:name: service-productdatasource:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3306/db_mybatis?serverTimezone=UTCusername: rootpassword: wwt15991178033#服务地址cloud:nacos:discovery:server-addr: 127.0.0.1:8848

4 启动服务, 观察nacos的控制⾯板中是否有注册上来的商品微服务

 5.修改订单微服务controller

    @RequestMapping("/order/prod/{pid}")public Order order(@PathVariable("pid") Integer pid){//从nacos中获取服务地址ServiceInstance serviceInstance = discoveryClient.getInstances("service-product").get(0);String url = serviceInstance.getHost() + ":" + serviceInstance.getPort();//调用商品微服务,查询商品信息Product product = restTemplate.getForObject("http://"+url+"/product/"+pid,Product.class);//下单(常见订单)Order order = new Order();order.setUid(1);order.setUsername("测试用户1");order.setPid(pid);order.setPname(product.getPname());order.setPprice(product.getPprice());order.setNumber(1);orderService.createOrder(order);return order;}

3.服务调⽤Ribbon⼊⻔

经过以上的学习,已经实现了服务的注册和服务发现。当启动某个服务的时候,可以通过HTTP的形式 将信息注册到注册中⼼,并且可以通过SpringCloud提供的⼯具获取注册中⼼的服务列表。但是服务之间的调⽤还存在很多的问题,如何更加⽅便的调⽤微服务,多个微服务的提供者如何选择,如何负载均衡等。

3.1 Ribbon概述

3.1.1 什么是Ribbon

是 Netflixfa 发布的⼀个负载均衡器,有助于控制 HTTP 和 TCP客户端⾏为。在 SpringCloud 中, Nacos⼀般配合Ribbon进⾏使⽤,Ribbon提供了客户端负载均衡的功能,Ribbon利⽤从Nacos中读取到 的服务信息,在调⽤服务节点提供的服务时,会合理的进⾏负载。 在SpringCloud中可以将注册中⼼和Ribbon配合使⽤,Ribbon⾃动的从注册中⼼中获取服务提供者的列 表信息,并基于内置的负载均衡算法,请求服务。

3.1.2 Ribbon的主要作⽤

( 1)服务调⽤ 基于Ribbon实现服务调⽤, 是通过拉取到的所有服务列表组成(服务名-请求路径的)映射关系。借助 RestTemplate 最终进⾏调⽤

( 2)负载均衡 当有多个服务提供者时,Ribbon可以根据负载均衡的算法⾃动的选择需要调⽤的服务地址

3.2 基于Ribbon实现订单调⽤商品服务 3.2.1 坐标依赖 在springcloud提供的服务发现的jar中以及包含了Ribbon的依赖。所以这⾥不需要导⼊任何额外的坐标

3.2.2 ⼯程改造

( 1 )服务提供者 控制台打印查询商品的信息

( 2 )服务消费者 在创建RestTemplate⽅法 上添加 @LoadBalanced 注解

@EnableDiscoveryClient
@SpringBootApplication
public class ShopOrderApplication {public static void main(String[] args) {SpringApplication.run(ShopOrderApplication.class, args);}@Bean@LoadBalanced//负载均衡public RestTemplate restTemplate(){return new RestTemplate();}
}

通过服务名称消费使⽤

restTemplate .getForObject("http://商品服务名称/product/1" , Product.class);

@RestController
public class OrderController {@Autowiredprivate RestTemplate restTemplate;@Autowiredprivate IOrderService orderService;@RequestMapping("/order/prod/{pid}")public Order order(@PathVariable("pid") Integer pid){//通过restTemplate调用商品微服务String url = "service-product";Product product = restTemplate.getForObject("http://"+url+"/product/" + pid, Product.class);//下单(常见订单)Order order = new Order();order.setUid(1);order.setUsername("测试用户1");order.setPid(pid);order.setPname(product.getPname());order.setPprice(product.getPprice());order.setNumber(1);orderService.createOrder(order);return order;}
}

4.服务调⽤Ribbon⾼级

4.1 负载均衡概述
4.1.1 什么是负载均衡

在搭建⽹站时,如果单节点的 web服务性能和可靠性都⽆法达到要求;或者是在使⽤外⽹服务时,经常 担⼼被⼈攻破,⼀不⼩⼼就会有打开外⽹端⼝的情况,通常这个时候加⼊负载均衡就能有效解决服务问 题。

负载均衡是⼀种基础的⽹络服务,其原理是通过运⾏在前⾯的负载均衡服务,按照指定的负载均衡算 法,将流量分配到后端服务集群上,从⽽为系统提供并⾏扩展的能⼒。 负载均衡的应⽤场景包括流量包、转发规则以及后端服务,由于该服务有内外⽹个例、健康检查等功 能,能够有效提供系统的安全性和可⽤性。

4.2 基于Ribbon实现负载均衡

Ribbon内置了多种负载均衡策略,内部负责复杂均衡的顶级接⼝为 com.netflix.loadbalancer.IRule ,实现⽅式如下

  • com.netflix.loadbalancer.RoundRobinRule :以轮询的⽅式进⾏负载均衡

  • com.netflix.loadbalancer.RandomRule :随机策略

  • com.netflix.loadbalancer.RetryRule :重试策略

  • com.netflix.loadbalancer.WeightedResponseTimeRule :权重策略。会计算每个服务的权重,越⾼的被调⽤的可能性越⼤

  • com.netflix.loadbalancer.BestAvailableRule :最佳策略。遍历所有的服务实例,过滤掉故障实例,并返回请求数最⼩的实例返回

  • com.netflix.loadbalancer.AvailabilityFilteringRule :可⽤过滤策略。过滤掉故障和请 求数超过阈值的服务实例,再从剩下的实⼒中轮询调⽤

  • ZoneAvoidanceRule:以区域可⽤的服务器为基础进⾏服务器的选择。使⽤Zone对服务器进⾏分类,这个Zone可以理解为⼀个机房、⼀个机架等。⽽后再对Zone内的多个服务做轮询

⾃定义负载均衡策略

⽅式1:定义⼀个新的IRule:(全局设置)

 @Beanpublic IRule randomRule(){return new RandomRule();}

⽅式2:在yml配置⽂件中配置:(局部设置)

 #需要调⽤的微服务名称service-product:ribbon:NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule

5.Nacos配置管理

5.1 统⼀配置管理

5.1.1 在nacos中添加配置⽂件

 

 注意:项⽬的核⼼配置,需要热更新的配置才有放到nacos管理的必要。基本不会变更的⼀些配置还是保 存在微服务本地⽐较好。

5.1.2 从微服务拉取配置

bootstrap.yaml⽂件,会在application.yml之前被读取

 配置实现步骤:

1)引⼊nacos-config依赖

<dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> 
</dependency>

2)添加bootstrap.yaml 不能使⽤原来的application.yml作为配置⽂件,⽽是新建⼀个bootstrap.yml作为配置⽂件

配置⽂件优先级(由⾼到低):

bootstrap.properties -> bootstrap.yml -> application.properties -> application.yml

 spring:application:name: service-productcloud:nacos:config: YAMLserver-addr: 127.0.0.1:8848 #nacos中⼼地址file-extension: yaml # 配置⽂件格式profiles:active: dev #环境标识,开发环境

4) 在nacos中添加配置

5.2 配置热更新

我们最终的⽬的,是修改nacos中的配置后,微服务中⽆需重启即可让配置⽣效,也就是配置热更新。 要实现配置热更新,可以使⽤两种⽅式: 配置中⼼添加配置:

config:
appName: product
5.2.1.⽅式

在@Value注⼊的变量所在类上添加注解@RefreshScope:

 @RestController@RefreshScope//
只需要在需要动态读取配置的类上添加此注解就可以
public class NacosConfigController {@Value("${config.appName}")private String appName; @GetMapping("/nacos-config-test1") public String nacosConfingTest1() {return appName;} 
}

5.3 配置共享

当配置越来越多的时候,我们就发现有很多配置是重复的,这时候就考虑可不可以将公共配置⽂件 提取出来

5.3.1 同服务内配置共享

现步骤:

  1. 新建⼀个以 spring.application.name 命名的配置⽂件,然后将其所有环境的公共配置放在⾥ ⾯

     2. 新建⼀个名为service-product-test.yaml配置存放测试环境的配置

     3. 新建⼀个名为service-product-dev.yaml配置存放开发环境的配置

 

    4. 在两个环境⽂件中配置独有信息

# 多配置⼀段
config:env: test
# 多配置⼀段
config:env: dev 

    5. 添加测试⽅法

@RestController
@RefreshScope//动态读取配置类
public class NocasConfigController {@Value("@{config.appName}")private String appName;@GetMapping("/nacos-config-test1")public String nacosStringTest1(){return appName;}
}

5.3.2 不同微服务共享配置

不同服务之间实现配置共享的原理类似于⽂件引⼊,就是定义⼀个公共配置,然后在当前配置中引 ⼊

  1. 在nacos中定义⼀个DataID为all-service.yaml的配置,⽤于所有微服务共享

spring: datasource: driver-class-name: com.mysql.jdbc.Driver url: jdbc:mysql:///shopserverTimezone=UTCusername: root password: root cloud:nacos: discovery: server-addr: 127.0.0.1:8848

    2. 修改bootstrap.yaml

spring:application:name: service-productcloud:nacos:config:server-addr: 127.0.0.1:8848 #nacos中心地址file-extension: yaml #配置文件格式shared-dataids: datasource.yaml #配置要引入的配置refreshable-dataids: datasource.yaml #配置要实现动态配置刷新的配置profiles:active: dev

    3. 启动商品微服务进⾏测试

配置共享的优先级

当nacos、服务本地同时出现相同属性时,优先级有⾼低之分:

 服务名-profile.yaml > 服务名称.yaml > 本地配置(bootstrap > application)

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

openmv学习笔记(24电赛备赛笔记)

#openmv简介 openmv一种小型&#xff0c;可编程机器视觉摄像头&#xff0c;设计应用嵌入式应用和计算边缘&#xff0c;是图传模块&#xff0c;或者认为是一种&#xff0c;具有图像处理功能的单片机&#xff0c;提供多种接口&#xff08;I2C SPI UART CAN ADC DAC &#xff0…

204、【动态规划】牛客网 ——DP3 跳台阶扩展问题(Python版本)

题目描述 原题链接&#xff1a;DP3 跳台阶扩展问题 解题思路 一个DP问题&#xff0c;相比于普通爬楼&#xff08;只能爬一层或者两层&#xff09;对应的状态函数为 d p [ i ] d p [ i − 1 ] d p [ i − 2 ] dp[i] dp[i - 1] dp[i - 2] dp[i]dp[i−1]dp[i−2]。本题的dp…

vue3+g2plot实现词云图

词云图 效果预览: 核心代码: import {WordCloud } from @antv/g2plot;fetch(https://gw.alipayobjects.com/os/antfincdn/jPKbal7r9r/mock.json).then((res) => res.json()).then((data) => {const wordCloud = new WordCloud(container, {data,wordField: x,weigh…

秒懂Linux之权限

目录 一.Linux用户 二.文件权限 2.1 权限属性 chmod命令 chown与chgrp命令 2.2 文件类型 file指令 常见类型 2.3 常见权限问题 问题一&#xff1a; 问题二&#xff1a; 问题三&#xff1a; 一.Linux用户 Linux 下有两种用户&#xff1a;超级用户&#xff08; root …

kettle从入门到精通 第八十课 ETL之kettle kettle中的json对象字段写入postgresql中的json字段

场景&#xff1a;源数据库表为mysql的其中有json字段&#xff0c;通过kettle 查询出来 插入到目标数据库 postgresql中&#xff0c;对应的表中也有json字段。。但是报错&#xff0c;提示kettle查询出来是varchar的的字段&#xff0c;无法插入到目标数据库中。 1、创建测试表。 …

VBA技术资料MF180:将某个文件夹中的某类图片导入Word

我给VBA的定义&#xff1a;VBA是个人小型自动化处理的有效工具。利用好了&#xff0c;可以大大提高自己的工作效率&#xff0c;而且可以提高数据的准确度。“VBA语言専攻”提供的教程一共九套&#xff0c;分为初级、中级、高级三大部分&#xff0c;教程是对VBA的系统讲解&#…

【C++进阶学习】第九弹——哈希的原理与实现——开放寻址法的讲解

前言&#xff1a; 在前面&#xff0c;我们已经学习了很多存储机构&#xff0c;包括线性存储、树性存储等&#xff0c;并学习了多种拓展结构&#xff0c;效率也越来越高&#xff0c;但是是否有一种存储结构可以在大部分问题中都一次找到目标值呢&#xff1f;哈希可能能实现 目录…

【C++】C++应用案例-翻转数组

翻转数组&#xff0c;就是要把数组中元素的顺序全部反过来。比如一个数组{1,2,3,4,5,6,7,8}&#xff0c;翻转之后就是{8,7,6,5,4,3,2,1}。 &#xff08;1&#xff09;另外创建数组&#xff0c;反向填入元素 数组是将元素按照顺序依次存放的&#xff0c;长度固定。所以如果想要…

C++ | Leetcode C++题解之第283题移动零

题目&#xff1a; 题解&#xff1a; class Solution { public:void moveZeroes(vector<int>& nums) {int n nums.size(), left 0, right 0;while (right < n) {if (nums[right]) {swap(nums[left], nums[right]);left;}right;}} };

Go语言编程 学习笔记整理 第2章 顺序编程 前半部分

前言&#xff1a;《Go语言编程》编著 许式伟 吕桂华 等 1.1 变量 var v1 int var v2 string var v3 [10]int // 数组 var v4 []int // 数组切片 var v5 struct { f int } var v6 *int // 指针 var v7 map[string]int // map&#xff0c;key为string类型&#xff0c;value为in…

shell脚本(fifteen day)

一、shell概述 1、shell概念 &#xff08;1&#xff09;shell 英文翻译过来是外壳的意思&#xff0c;作为计算机语言来理解可以认为它是操作系统的外壳。可以通过shell 命令来操作和控制操作系统&#xff0c;比如Linux中的shell命令就包括 ls、cd、pwd 等等。 &#xff08;2&a…

postgres启动错误

说明&#xff1a;记录一次在Linux上启动postgres数据错误&#xff1b; 问题&#xff1a;安装好postgres数据库后&#xff0c;我使用systemctl启动数据库&#xff0c;报下面的错误 ● postgresql-15.service - PostgreSQL 15 database serverLoaded: loaded (/usr/lib/systemd…

【研路导航】保研英语面试高分攻略,助你一路过关斩将

面试攻略之 千锤百炼英语口语 写在前面 在保研面试中&#xff0c;英语口语往往是让许多同学感到头疼的一部分。如何在面试中展现出自信和流利的英语表达能力&#xff0c;是我们今天要探讨的主题。以下是一些有效的英语口语练习方法和常见题型解析&#xff0c;帮助你在保研面试…

使用PyTorch导出JIT模型:C++ API与libtorch实战

PyTorch导出JIT模型并用C API libtorch调用 本文将介绍如何将一个 PyTorch 模型导出为 JIT 模型并用 PyTorch 的 CAPI libtorch运行这个模型。 Step1&#xff1a;导出模型 首先我们进行第一步&#xff0c;用 Python API 来导出模型&#xff0c;由于本文的重点是在后面的部署…

Java-----栈

目录 1.栈&#xff08;Stack&#xff09; 1.1概念 1.2栈的使用 1.3栈的模拟实现 1.4栈的应用场景 1.5栈、虚拟机栈、栈帧有什么区别呢 1.栈&#xff08;Stack&#xff09; 1.1概念 栈&#xff1a;一种特殊的线性表&#xff0c;其只允许在固定的一端进行插入和删除元素操…

Java基础入门14:常用API(Object(s)类、包装类、Math、Arrays、日期时间、Lambda表达式、方法引用)

Object类 Object类是Java中所有类的祖宗类&#xff0c;因此&#xff0c;Java中所有类的对象都可以直接使用Object类中提供的一些方法。 Object类的常见方法&#xff1a; package com.itchinajie.d12_api_object;public class Test {public static void main(String[] args) {…

mybatis-plus默认字段填充以及批量数据插入优化

日常开发中&#xff0c;我们需要设置一些数据库的默认字段填充&#xff0c;比如创建时间、创建人、更新时间、更新人等等&#xff0c;那么mybatis-plus给我们提供了一个这样的接口去做这件事情 MetaObjectHandler。 1、首先可以创建一个实现类来实现MetaObjectHandler接口 C…

DBMotion x Chat2DB:高效迁移,优雅同步,数据腾飞不再愁

DBMotion 基本介绍 数据传输服务DBMotion是一款轻量、绿色的数据库迁移、同步、校验工具。支持国产化数据迁移、支持容灾演练、支持两地三中心和异地多活&#xff1b;源库无感知、简单易集成、丝滑高性能。助您在多云之间随心迁移、自由容灾。 功能介绍 已支持的数据库 v1.…

7月22日JavaSE学习笔记

Collection接口&#xff0c;还有一个父级接口Iterable可迭代的 Collection继承树 Set 集合 Set的底层是用Map实现&#xff08;存储在key中&#xff0c;value中是空的Object对象&#xff09; 有序&#xff1a;取出的顺序和添加的顺序是一样的。 List是有序的&#xff0c;Set是…

“软件质量”,构筑企业值得信赖的护城河

引子 质量是产品的生命线&#xff0c;质量问题不仅会导致企业财产损失&#xff0c;还可能引发业务中断、客户满意度下降、企业品牌声誉受损等负面影响。如何在软件开发过程中全方位构建产品质量防护盾&#xff0c;是各行业保障产品高质量的重要课题。 如何保障软件质量&#…