微服务架构(小白教学1)

news2025/1/31 11:04:34

相信大家吃饭的时候肯定是很苦恼打饭之慢,在自己饥肠辘辘的时候,面对自己喜欢吃的食物窗口却如同有百万大军虎视眈眈,自己内心的煎熬可想而知

有时候在想这么美味的食物,为什么窗口就只开一个呢?于是你告诉了你的爸爸(校长),“小kiss”,于是当天这家窗口又新增了3个窗口,你很喜欢、很满意

但是新问题又出现了,你想一天换着口味吃,但是总感觉一个窗口卖三种食物不是太好,于是你又...,校长的话怎么能不听,当天三个窗口就开始食物分离开来,自己只负责自己所卖的食物

这个故事告诉我们,(有个厉害的爸爸有多么重要)哈哈!!!

言归正传,当第一种情况,有且仅有一个窗口中不仅卖着面条、米饭还有炒面,当学生想吃这些食物的时候,就必须要在这个窗口进行排队,人少不影响,如果人多,厨师的手都快要炒断了(单体应用架构)

当第二种情况,当你的爸爸大显神通时,把窗口增加到了3个,对一个窗口业务进行了分担,解决了一些人流量大的问题(集群应用架构)

但是又发生了一些情况,当你想吃面条的时候,你去排队,结果你的前面都是准备买炒面、米饭的人,这时候你又受不了了,所以你又...,把食物按照食物种类进行分类(垂直应用架构)

所以就有了微服务架构。

微服务架构

那么微服务架构有哪些优势呢?

  1. 独立开发:所有微服务都可以根据各自的功能进行开发

  1. 独立部署:基于其服务,可以在任何应用程序中单独部署它们

  1. 故障隔离:及时应用程序的一项服务起不来,系统仍然可以继续运行

  1. 混合技术栈:可以使用不同的 语言和技术来构建同一应用程序的不同服务

  1. 粒度缩放:单个组件可根据需要进行缩放,无需将组件缩放在一起

于是我们在idea中进行操作

在一个大的项目中,开了4个模块,一个模块是专门负责进行实体类的创建,一个模块是专门进行下单的模块,一个模块是专门进行查询产品的模块,最后一个模块是专门进行查询user的模块,将每个功能进行分离,那么每个模块和模块之间是怎么练习的呢?

我们是不是需要一个桥梁将它们进行某一种程度上的连接呢?

微服务中常见的概念

服务治理:对服务进行自动化管理,核心就是服务的自动注册以及发现

服务注册:服务实例将自身服务信息注册到服务 注册中心

服务发现:服务实例通过注册中心,获取到注册到其中的服务实例的信息,通过信息去请求它们进行提供服务

服务剔除:服务注册中心将问题的服务自动剔除到可用列表之外,使其不会被调用到

接下来我们一一进行演示操作

服务治理:

我们在这里用的是nacos(提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置等)

如何搭建nacos环境
  1. 安装nacos

https://github.com/alibaba/nacos/releases 下载解压并安装

  1. 在控制面板(CMD)启动nacos

进入nacos中的bin目录

startup.cmd -m standalone

  1. 访问nacos

打开网址 http://localhost:8848/nacos 默认密码是:nacos /nacos

  1. 将微服务进行注册

在所需要注册的模块中添加nacos的依赖

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

在启动类中添加@EnableDiscoveryClient 注解

在配置中添加nacos的服务地址

#在spring中进行配置
cloud:
 nacos:
  discovery:
   server-addr: 127.0.0.1:8848

然后对服务进行启动,在nacos中就可以监听到商品的微服务服务了

负载均衡

第一版本:

 User user = restTemplate.getForObject("http://127.0.0.1:8091/user/finduser/"+uid,User.class);
 Product product  =restTemplate.getForObject("http://127.0.0.1:8081/product/findProduct/"+pid,Product.class);

对模块进行访问(根据ip+端口),这种方式虽然可以访问到,但是这种访问是写死的,我们难道要每一次在访问的时候都要用这种方式进行访问未免太过于繁琐,于是我们想要动态将ip和端口显示出来,故有了第二版:

@Autowired
DiscoveryClient discoveryClient;

 /*
             在订单服务中,需要远程调用用户服务,和商品服务
          */
     //获取服务列表
        List<ServiceInstance> instance= discoveryClient.getInstances("service-user");
     //随机生成索引
        Integer index=new Random().nextInt(instance.size());
        //获取服务
        ServiceInstance userService=instance.get(index);
        //获取服务地址
        String url=userService.getHost()+":"+userService.getPort();


        List<ServiceInstance> instance1= discoveryClient.getInstances("service-product");
        //随机生成索引
        Integer index1=new Random().nextInt(instance1.size());
        //获取服务
        ServiceInstance productuService=instance1.get(index1);
        //获取服务地址
        String url1=productuService.getHost()+":"+productuService.getPort();

        User user = restTemplate.getForObject("http://"+url+"/user/finduser/"+uid,User.class);
        Product product  =restTemplate.getForObject("http://"+url1+"/product/findProduct/"+pid,Product.class);

这种方式解决了把ip+端口写死的问题,但是又出现了一个新的问题,这种方式,如果存在两个服务实力,服务调用者只会调用第一个服务实例,另外一个服务实例将会被搁置,导致资源浪费,所以我们又出现了第三版:

  User user = restTemplate.getForObject("http://service-user/user/finduser/"+uid,User.class);
        Product product  =restTemplate.getForObject("http://service-product/product/findProduct/"+pid,Product.class);

在yml中配置:

ribbon:
 ConnectTimeout: 2000 # 请求连接的超时时间
 ReadTimeout: 5000 # 请求处理的超时时间
service-product: # 调用的提供者的名称
 ribbon:
  NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule

以下给大家介绍负载均衡的七种策略

RoundRobinRule(轮询策略):按顺序来一人一次
WeightedResponseTimeRule(权重策略):根据响应时间分配权重,权重越高,被选的几率也就越高
RandomRule(随机策略):随机提供一个服务实例
BestAvailableRule(最小连接数策略):取到连接数最小的一个服务实例
RetryRule(重试策略):轮询策略进行获取,如果获取不到,反复进行重试进行获取,如若超过时间,则返回null
AvailabilityFilteringRule(可用敏感性策略):先过滤掉非健康的服务实例,再选择连接数较小的进行连接
ZoneAvoidanceRule(区域敏感策略):根据服务所在的区域的性能进行选择服务实例

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

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

相关文章

浅谈运维工程师的开发能力的培养

写在前面 本文已获得作者授权&#xff0c;作者的博客地址&#xff1a;https://www.cuiliangblog.cn/ 原文链接&#xff1a;浅谈运维工程师的开发能力的培养 一、运维工程师发展路线 1. 传统运维 侧重点是解决具体的问题。要求具备扎实的底层的知识储备&#xff0c;如网络、l…

安卓 Frament + ViewPager使用示例

1. 组成架构 整个架构被包在一个外部Fragment之中&#xff0c;也可以放在一个Activity之中&#xff0c;随意。外部的fragment包含了两个组件&#xff0c;即途中的ViewPager和TabLayoutViewPager要套上一个FragmentStatePagerAdapter &#xff0c;适配器负责new出一个个fragment…

基于Jetson NX的模型部署

系统安装 系统安装过程分为3步&#xff1a; 下载必要的软件及镜像 Jetson Nano Developer Kit SD卡映像 https://developer.nvidia.com/jetson-nano-sd-card-image Windows版SD存储卡格式化程序 https://www.sdcard.org/downloads/formatter_4/eula_windows/ 镜像烧录工具…

嵌入式C语言九大数据结构操作方式详解

在C语言的开发过程中&#xff0c;灵活使用数据结构&#xff0c;对提高编程效率有极大的帮助。 目录 1 数组 2 链表 3 跳表 4 栈 5 队列 6 树 7 堆 8 散列表 9 图 10 总结 数据结构想必大家都不会陌生&#xff0c;对于一个成熟的程序员而言&#xff0c;熟悉和掌握数据…

【C++、C++11】列表初始化、右值引用

文章目录&#x1f4d6; 前言1. 统一的列表初始化1.1 { } 花括号初始化&#xff1a;1.2 std::initializer_list&#xff1a;2. 右值引用2.1 什么是左值和右值&#xff1a;2.2 右值的分类&#xff1a;2.3 左值引用和右值引用的比较2.3 右值的使用场景&#xff1a;2.4 新的类功能&…

SpringBoot整合Quartz以及异步调用

文章目录前言一、异步方法调用1、导入依赖2、创建异步执行任务线程池3、创建业务层接口和实现类4、创建业务层接口和实现类二、测试定时任务1.导入依赖2.编写测试类&#xff0c;开启扫描定时任务3.测试三、实现定时发送邮件案例1.邮箱开启IMAP服务2.导入依赖3.导入EmailUtil4.编…

为「IT女神勋章」而战

大家好&#xff0c;我是空空star&#xff0c;今天为「IT女神勋章」而战 文章目录前言一、IT女神勋章二、绘制爱心1.htmlcssjs来源&#xff1a;一行代码代码效果2.python来源&#xff1a;C知道代码效果3.go来源&#xff1a;复制代码片代码效果4.java来源&#xff1a;download代码…

游戏算法-游戏AI状态机,python实现

AI概述 游戏AI是对游戏内所有非玩家控制角色的行为进行研究和设计&#xff0c;使得游戏内的单位能够感知周围环境&#xff0c;并做出相应的动作表现的技术。游戏AI作为游戏玩法的一大补充&#xff0c;在各种游戏中都有广泛的应用&#xff0c;比如可以和玩家交互聊天的NPC&#…

用户体验设计—影响定制化设计的因素

0 前言最近在上信息构建这门课&#xff08;名为信息构建&#xff0c;但感觉叫用户体验设计更好。。。&#xff09;老师是研究信息行为、人智交互这块的&#xff0c;所以实验课要求我们先学习一个实际的设计案例&#xff0c;让我们搞懂影响定制化设计的因素。所以这篇文章讲讲我…

七色电子标签

机种名 电子会议桌牌 型号 ESL_7color_7.3_D 外观尺寸 176.2x137.15x80mm 产品重量 268g 可视区域 163.297.92mm 外观颜色 银色 供电方式 锂电池供电2300mAh&#xff08;Type-C 接口可充电&#xff09; 显示技术 E-INK电子纸&#xff0c;双屏 像素 800x480 像…

ByteTrack: Multi-Object Tracking by Associating Every Detection Box 论文详细解读

ByteTrack: Multi-Object Tracking by Associating Every Detection Box 论文详细解读 文章目录ByteTrack: Multi-Object Tracking by Associating Every Detection Box 论文详细解读ByteTrackByteTrack算法简介ByteTrack算法流程ByteTrack算法描述一&#xff1a;对检测框进行分…

SOA架构的理解

1. SOA概述 SOA&#xff08;Service-Oriented Architecture&#xff0c;面向服务的架构&#xff09;是一种在计算机环境中设计、开发、部署和管理离散模型的方法。SOA不是一种新鲜事物&#xff0c;它是在企业内部IT系统重复构建以及效率低下的背景下提出的。在SOA模型中&#x…

Nexus 3 清理docker镜像

该文章提供了一种清理nexus3中存储的docker镜像的一种新思路 查看docker repo 比如你的docker repo名字叫做test-repo&#xff0c;然后在nexus3首页的seatch下面找到docker&#xff0c;点进去随便查看一个已经上传的镜像 记住上面的Name选项&#xff0c;之后要用到 设定清理…

centos7 oracle19c安装||新建用户|| ORA-01012: not logged on

总共分三步 1.下载安装包:里面有一份详细的安装教程 链接&#xff1a;https://pan.baidu.com/s/1Of2a72pNLZ-DDIWKrTQfLw?pwd8NAx 提取码&#xff1a;8NAx 2.安装后,执行初始化:时间较长 /etc/init.d/oracledb_ORCLCDB-19c configure 3.配置环境变量,不配置环境变量,sq…

【Linux快速入门】文件目录操作

文章目录概念1. Linux文件系统概述2. Linux文件目录结构3. Linux文件和目录操作3.1 文件操作3.1.1 创建文件3.1.2 复制文件3.1.3 移动文件3.1.4 删除文件3.1.5 查看文件3.1.6 输出指令3.1.7 >和>>指令3.2 目录操作3.2.1 创建目录3.2.2 复制目录3.2.3 移动目录3.2.4 删…

Lesson 8.3 ID3、C4.5 决策树的建模流程 Lesson 8.4 CART 回归树的建模流程与 sklearn 参数详解

文章目录一、ID3 决策树的基本建模流程二、C4.5 决策树的基本建模流程1. 信息值&#xff08;information value&#xff09;2. C4.5 的连续变量处理方法三、CART 回归树的基本建模流程1. 数据准备2. 生成备选规则3. 挑选规则4. 进行多轮迭代5. 回归树的预测过程四、CART 回归树…

关于推荐系统的详细介绍

简介推荐系统是一种信息过滤系统&#xff0c;能够自动预测用户对特定产品或服务的偏好&#xff0c;并向其提供个性化的推荐。它通常基于用户的历史行为、个人喜好、兴趣和偏好等&#xff0c;通过数据挖掘和机器学习算法&#xff0c;在大数据的支持下生成个性化的推荐内容&#…

智云通CRM:与权力者沟通的策略有哪些?

权力者通常具备两个特点&#xff1a;忙和目标导向 1.忙 权力者都很忙&#xff08;不忙也会装出很忙的样子&#xff09;&#xff0c;时间精力有限&#xff0c;销售人员眼里的大项目在权力者看来很有可能只是他诸多工作中的一项。因此&#xff0c;即使有不满者的引荐&#xff0c;…

ChatGPT露馅了,它明明就是人

让人工智能理解句子成分和语义&#xff0c;这看起来是件不可能的事&#xff0c;看过流浪地球的都知道&#xff0c;那里面的人工智能哪怕发展到2057年&#xff0c;也听不懂比喻和反问。 那最近大火的chatGPT能不能听懂冷笑话呢&#xff1f;它不仅能写代码、论文&#xff0c;居然…

Spring学习——拦截器

拦截器概念 拦截器&#xff08;Interceptor )是一种动态拦截方法调用的机制&#xff0c;在SpringMVC中动态拦截控制器方法的执行作用: 在指定的方法调用前后执行预先设定的代码阻止原始方法的执行 拦截器与过滤器区别 归属不同&#xff1a;Filter属于Servlet技术&#xff0…