B003-springcloud alibaba 服务治理 nacos discovery ribbon feign

目录

      • 服务治理
        • 服务治理介绍
        • 什么是服务治理
        • 相关方案
      • nacos实战入门
        • 搭建nacos环境
          • 安装nacos
          • 启动nacos
          • 访问nacos
        • 将商品微服务注册进nacos
        • 将订单微服务注册进nacos
        • 订单服务通过nacos调用商品服务
      • 实现服务调用的负载均衡
        • 什么是负载均衡
        • 代码实现负载均衡
          • 增加一个服务提供者
          • 自定义实现负载均衡
          • 用ribbon实现负载均衡
      • 基于feign实现服务调用
        • 什么是feign
        • feign的使用

服务治理

服务治理介绍

通过上一章的操作,我们已经可以实现微服务之间的调用。但是我们把服务提供者的网络地址(ip,端口)等硬编码到了代码中,这种做法存在许多问题:

一旦服务提供者地址变化,就需要手工修改代码
一旦是多个服务提供者,无法实现负载均衡功能
一旦服务变得越来越多,人工维护调用关系困难

那么应该怎么解决呢,这时候就需要通过注册中心动态的实现服务治理。

什么是服务治理

服务治理是微服务架构中最核心最基本的模块。用于实现各个微服务的自动化注册与发现。

服务注册和心跳机制/续约:在服务治理框架中,都会构建一个注册中心,每个服务单元向注册中心登记自己提供服务的详细信息,并在注册中心形成一张服务的清单,服务注册中心需要以心跳的方式去监测清单中的服务是否可用,如果不可用,需要在服务清单中剔除不可用的服务。

服务发现:服务调用方向服务注册中心咨询服务,并获取所有服务的实例清单,实现对具体服务实例的访问。
在这里插入图片描述

相关方案

zookeeper
zookeeper是一个分布式服务框架,是Apache Hadoop的一个子项目,它主要是用来解决分布式应用中经常遇到的一些数据管理问题,如:统一命名服务、状态同步服务、集群管理、分布式应用配置项的管理等。
consul
Consul是基于GO语言开发的开源工具,主要面向分布式,服务化的系统提供服务注册、服务发现和配置管理的功能。Consul的功能都很实用,其中包括:服务注册/发现、健康检查、Key/Value存储、多数据中心和分布式一致性保证等特性。Consul本身只是一个二进制的可执行文件,所以安装和部署都非常简单,只需要从官网下载后,在执行对应的启动脚本即可。
eureka
Eureka是Springcloud Netflix中的重要组件,主要作用就是做服务注册和发现。但是现在已经闭源
nacos
Nacos是一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。它是Spring Cloud Alibaba组件之一,负责服务注册发现和服务配置,可以这样认为nacos=eureka+config。

nacos实战入门

在这里插入图片描述

搭建nacos环境
安装nacos

下载地址:https://github.com/alibaba/nacos/releases
下载zip版本,解压缩

启动nacos

双击或命令行

cd nacos/bin
startup.cmd -m standalone
访问nacos

打开浏览器输入http://localhost:8848/nacos,即可访问服务,默认密码是nacos/nacos
如果有服务注册进来会显示在服务列表

将商品微服务注册进nacos

导包

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

application.yml中添加nacos服务地址

  cloud:nacos:discovery:server-addr: localhost:8848

启动类注解

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

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

将订单微服务注册进nacos

导包,配置,启动类注解,都同上

订单服务通过nacos调用商品服务

OrderController

    /*** 用nacos调用服务*/@RequestMapping("/order/product2/{pid}")public Order createOrder2(@PathVariable("pid") Integer pid) {log.info("接收到{}号商品的下单请求,接下来调用商品微服务查询此商品信息", pid);// 调用商品微服务,查询商品信息List<ServiceInstance> instances = discoveryClient.getInstances("service-product");ServiceInstance instance = instances.get(0);Product product = restTemplate.getForObject("http://" + instance.getHost() + ":" + instance.getPort() + "/product/" + pid, Product.class);log.info("查询到{}号商品的信息,内容是{}", pid, JSON.toJSONString(product));// 下单/创建订单Order order = new Order();order.setUid(1);order.setUsername("测试用户");order.setPid(product.getPid());order.setPname(product.getPname());order.setPprice(product.getPprice());order.setNumber(1);orderService.createOrder(order);log.info("创建订单成功,订单信息为{}", JSON.toJSONString(order));return order;}

浏览器访问测试:http://localhost:8091/order/product2/2

实现服务调用的负载均衡

什么是负载均衡

通俗的讲,负载均衡就是将负载(工作任务,访问请求)进行分摊到多个操作单元(服务器,组件)上进行执行。根据负载均衡发生位置的不同,一般分为服务端负载均衡和客户端负载均衡。
服务端负载均衡指的是发生在服务提供者一方,比如常见的nginx负载均衡,
而客户端负载均衡指的是发生在服务请求的一方,也就是在发送请求之前已经选好了由哪个实例处理请求。
在这里插入图片描述
我们在微服务调用关系中一般会选择客户端负载均衡,也就是在服务调用的一方来决定服务由哪个提供者执行。

代码实现负载均衡
增加一个服务提供者

一个项目并行运行的第二种方式:
编辑配置 - 添加新配置 - springboot
设置新名称,如ProductApp2
设置启动类,如ProductApp
修改端口号,如虚拟机选项:-Dserver.port=8082
启动后可在nacos中看到增加了一个服务实例
在这里插入图片描述

自定义实现负载均衡

修改消费者中OrderController的代码

    /*** 用nacos调用服务,并自定义实现负载均衡*/@RequestMapping("/order/product3/{pid}")public Order createOrder3(@PathVariable("pid") Integer pid) {log.info("接收到{}号商品的下单请求,接下来调用商品微服务查询此商品信息", pid);// 调用商品微服务,查询商品信息List<ServiceInstance> instances = discoveryClient.getInstances("service-product");int i = new Random().nextInt(instances.size());ServiceInstance instance = instances.get(i);log.info("第{}台机器,端口号是{}",i+1,instances.get(i).getPort());Product product = restTemplate.getForObject("http://" + instance.getHost() + ":" + instance.getPort() + "/product/" + pid, Product.class);log.info("查询到{}号商品的信息,内容是{}", pid, JSON.toJSONString(product));// 下单/创建订单Order order = new Order();order.setUid(1);order.setUsername("测试用户");order.setPid(product.getPid());order.setPname(product.getPname());order.setPprice(product.getPprice());order.setNumber(1);orderService.createOrder(order);log.info("创建订单成功,订单信息为{}", JSON.toJSONString(order));return order;}

浏览器访问测试:http://localhost:8091/order/product3/3

用ribbon实现负载均衡

添加LoadBalanced注解

@SpringBootApplication
@EnableDiscoveryClient
public class OrderApp {public static void main(String[] args) {SpringApplication.run(OrderApp.class,args);}@Bean@LoadBalancedpublic RestTemplate restTemplate(){return new RestTemplate();}
}

修改消费者的OrderController的代码

    /*** 用nacos调用服务,并用ribbon实现负载均衡*/@RequestMapping("/order/product4/{pid}")public Order createOrder4(@PathVariable("pid") Integer pid) {log.info("接收到{}号商品的下单请求,接下来调用商品微服务查询此商品信息", pid);// 调用商品微服务,查询商品信息Product product = restTemplate.getForObject("http://service-product/product/" + pid, Product.class);log.info("查询到{}号商品的信息,内容是{}", pid, JSON.toJSONString(product));// 下单/创建订单Order order = new Order();order.setUid(1);order.setUsername("测试用户");order.setPid(product.getPid());order.setPname(product.getPname());order.setPprice(product.getPprice());order.setNumber(1);orderService.createOrder(order);log.info("创建订单成功,订单信息为{}", JSON.toJSONString(order));return order;}

浏览器访问测试:http://localhost:8091/order/product4/1

如果想用默认的轮询以外的其他策略可在消费者的yml中加入以下配置

service-product: # 调用的提供者的名称ribbon:NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule

基于feign实现服务调用

什么是feign

Feign是Spring Cloud提供的一个声明式的伪Http客户端,它使得调用远程服务就像调用本地服务一样简单,只需要创建一个接口并添加一个注解即可。

Nacos很好的兼容了Feign,Feign默认集成了Ribbon,所以在Nacos下使用Fegin默认就实现了负载均衡的效果。

feign的使用

导包

    <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId></dependency>

启动类加注解

@EnableFeignClients(basePackages = "cn.ming.client") //如果是主内所在子包,可以不用加basePackages,但是最好加上

调用接口

@FeignClient(value = "service-product") //value用于指定调用nacos下哪个微服务
public interface ProductClient {// 商品信息查询@RequestMapping("/product/{pid}")   //@FeignClient的value + @RequestMapping的value值 其实就是完整的请求地址Product getProductByPid(@PathVariable("pid") Integer pid);
}

应用

    /*** 用nacos调用服务,并用feign实现带有负载均衡的调用*/@RequestMapping("/order/product5/{pid}")public Order createOrder5(@PathVariable("pid") Integer pid) {log.info("接收到{}号商品的下单请求,接下来调用商品微服务查询此商品信息", pid);// 调用商品微服务,查询商品信息Product product = productClient.getProductByPid(pid);log.info("查询到{}号商品的信息,内容是{}", pid, JSON.toJSONString(product));// 下单/创建订单Order order = new Order();order.setUid(1);order.setUsername("测试用户");order.setPid(product.getPid());order.setPname(product.getPname());order.setPprice(product.getPprice());order.setNumber(1);orderService.createOrder(order);log.info("创建订单成功,订单信息为{}", JSON.toJSONString(order));return order;}

浏览器访问测试:http://localhost:8091/order/product5/4

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

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

相关文章

离线数仓、实时数仓与数据湖

1 什么是数据仓库 数据仓库是一个为数据分析而设计的企业级数据管理系统。数据仓库可集中、整合多个信息源的大量数据&#xff0c;借助数据仓库的分析能力&#xff0c;企业可从数据中获得宝贵的信息进而改进决策。同时&#xff0c;随着时间的推移&#xff0c;数据仓库中积累的大…

《深入理解Maven:构建工具、常用命令与项目包技巧解析》

文章目录 何为构建工具 | ToolsMaven插件的常用命令 | Commondclean总结 | Summary compile总结 | Summary package总结 | Summary install总结 | Summary build和compile的区别 | Knowledge项目包技巧 | Method 在后端领域开发中&#xff0c;我们构建项目常用到了Maven和Gradl…

Science Robotics 封面论文:美国宇航局喷气推进实验室开发了自主蛇形机器人,用于冰雪世界探索

人们对探索冰冷的卫星&#xff08;如土卫二&#xff09;的兴趣越来越大&#xff0c;这可能具有天体生物学意义。然而&#xff0c;由于地表或冰口内的环境极端&#xff0c;获取样本具有挑战性。美国宇航局的喷气推进实验室正在开发一种名为Exobiology Extant Life Surveyor&…

【论文阅读笔记】Split frequency attention network for single image deraining

1.论文介绍 Split frequency attention network for single image deraining 用于单幅图像去噪的分频注意力网络 Paper Code 2023年 SIVP 2.摘要 雨纹对图像质量的影响极大&#xff0c;基于数据驱动的单图像去噪方法不断发展并取得了巨大的成功。然而&#xff0c;传统的卷积…

C/C++动态链接库的封装和调用

1 引言 静态链接库是在编译时被链接到程序中的库文件&#xff0c;在编译时&#xff0c;链接器将静态链接库的代码和数据复制到最终的可执行文件中。动态链接库是在程序运行时加载的库文件&#xff0c;在编译时&#xff0c;可执行文件只包含对动态链接库的引用&#xff0c;而不…

外贸网站文章批量生成器

随着全球贸易的不断发展&#xff0c;越来越多的企业开始关注外贸市场&#xff0c;而拥有高质量的内容是吸引潜在客户的关键之一。然而&#xff0c;为外贸网站生产大量优质的文章内容可能是一项耗时且繁琐的任务。因此&#xff0c;外贸网站文章批量生成软件成为了解决这一难题的…

语音识别:whisper部署服务器(远程访问,语音实时识别文字)

Whisper是OpenAI于2022年发布的一个开源深度学习模型&#xff0c;专门用于语音识别任务。它能够将音频转换成文字&#xff0c;支持多种语言的识别&#xff0c;包括但不限于英语、中文、西班牙语等。Whisper模型的特点是它在多种不同的音频条件下&#xff08;如不同的背景噪声水…

做跨境用哪种代理IP比较好?怎么选到干净的IP?

代理IP对于做跨境的小伙伴来说&#xff0c;都是必不可少的工具&#xff0c;目前出海的玩法已经是多种多样&#xff0c;开店、账号注册、短视频运营、直播带货、网站SEO等等都是跨境人需要涉及到的业务。而国外代理IP的获取渠道非常多&#xff0c;那么做跨境到底应该用哪种代理I…

基于Spring Boot的研究生志愿填报辅助系统

摘 要 二十一世纪我们的社会进入了信息时代&#xff0c;信息管理系统的建立&#xff0c;大大提高了人们信息化水平。传统的管理方式对时间、地点的限制太多&#xff0c;而在线管理系统刚好能满足这些需求&#xff0c;在线管理系统突破了传统管理方式的局限性。于是本文针对这一…

掌握请求控制权:Axios 如何取消请求的两种方法

在前端开发中&#xff0c;网络请求是非常常见的操作。而有时候&#xff0c;我们可能需要在发送请求后取消它&#xff0c;比如用户在请求还未完成时离开了当前页面或者执行了其他操作&#xff0c;本文将介绍如何在使用 Axios 发送请求时取消这些请求。 基本概念 在 Axios 中&am…

swagger使用手册

1.导入依赖 <!--引入swagger--><dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger2</artifactId><version>2.7.0</version></dependency><dependency><groupId>io.springfox</…

AR/MR产品设计(二):如何用一双手完成与虚拟对象的自然交互

AR/MR产品设计&#xff08;二&#xff09;&#xff1a;如何用一双手完成与虚拟对象的自然交互 - 知乎 手是我们与现实世界交互最重要的方式&#xff0c;同样在虚实混合的世界中是最重要的交互方式 在AR/MR/VR的交互中&#xff0c;手势交互会作为XR的重要交互动作&#xff0c;因…

鸿蒙开发 一 (一)、框架了解

一、UI框架 开发范式名称 语言生态 UI更新方式 适用场景 适用人群 声明式开发范式 ArkTS语言 数据驱动更新 复杂度较大、团队合作度较高的程序 移动系统应用开发人员、系统应用开发人员 类Web开发范式 JS语言 数据驱动更新 界面较为简单的程序应用和卡片 Web前端…

视频技术1:使用ABLMediaServer推流rtsp

ABLMediaServer定位是高性能、高稳定、开箱即用、商用级别的流媒体服务器 下边展示了如何把1个mp3作为输入源&#xff0c;转换为rtsp流的过程。 作用&#xff1a;用rtsp模拟摄像头的视频流 1、启动ABLMediaServer ABLMediaServer-2024-03-13\WinX64\ABLMediaServer.exe 配…

聚类分析 | Matlab实现基于NNMF+DBO+K-Medoids的数据聚类可视化

聚类分析 | Matlab实现基于NNMFDBOK-Medoids的数据聚类可视化 目录 聚类分析 | Matlab实现基于NNMFDBOK-Medoids的数据聚类可视化效果一览基本介绍程序设计参考资料 效果一览 基本介绍 NNMFDBOK-Medoids聚类&#xff0c;蜣螂优化算法DBO优化K-Medoids 非负矩阵分解&#xff08…

信息学奥赛一本通之MAC端VSCode C++环境配置

前提 安装 Visual Studio CodeVSCode 中安装 C/C扩展确保 Clang 已经安装&#xff08;在终端中输入命令&#xff1a;clang --version 来确认是否安装&#xff09;未安装&#xff0c;在命令行执行xcode-select --install 命令&#xff0c;会自行安装&#xff0c;安装文件有点大…

STM32实验DMA数据搬运小助手

本次实验做的是将一个数组的内容利用DMA数据搬运小助手搬运到另外一个数组中去。 最后的实验结果&#xff1a; 可以看到第四行的数据就都不是0了&#xff0c;成功搬运了过来。 DMA实现搬运的步骤其实不是很复杂&#xff0c;复杂的是结构体参数&#xff1a; 整个步骤为&#xf…

面试经典150题 -- 分治 (总结)

总的链接 : 面试经典 150 题 - 学习计划 - 力扣&#xff08;LeetCode&#xff09;全球极客挚爱的技术成长平台 108 . 将有序数组转换成二叉搜索树 : 链接 : . - 力扣&#xff08;LeetCode&#xff09; 思路 : 选择中间位置左边的数字作为根节点&#xff0c;然后递归调…

PostgreSQL 锁机制

锁存在的意义 在了解 PostgreSQL 锁之前&#xff0c;我们需要了解锁存在的意义是啥&#xff1f; 当多个会话同时访问数据库的同一数据时&#xff0c;理想状态是为所有会话提供高效的访问&#xff0c;同时还要维护严格的数据一致性。那数据一致性通过什么来维护呢&#xff0c;…

深入浅出Go的`encoding/xml`库:实战开发指南

深入浅出Go的encoding/xml库&#xff1a;实战开发指南 引言基本概念XML简介Go语言中的XML处理结构体标签&#xff08;Struct Tags&#xff09; 解析XML数据使用xml.Unmarshal解析XML结构体标签详解处理常见解析问题 生成XML数据使用xml.Marshal生成XML使用xml.MarshalIndent优化…