微服务架构第一阶段(nacos,gateWay,RPC)
最近在学习完 springcloud 微服务架构之后,自己用了之前的一个项目计划拆分成微服务的项目,第一阶段要求整合 nacos,RPC以及gateWay,首先来看一下几个技术组件的概念
RPC
RPC 框架 —— 远程过程调用协议RPC(Remote Procedure Call Protocol)—— 允许像本地服务一样调用远程服务
RPC是指远程过程调用,也就是说两台服务器 A,B,一个应用部署在 A 服务器上,想要调用 B 服务器上应用提供的函数 / 方法,由于不在一个内存空间,不能直接调用,需要通过网络表达调用的语义和传达的调用的数据,那么有一下几个问题
第一,首先,要解决服务之间的通信问题,主要通过客户端和服务之间建立 TCP 连接,远程过程调用的所有交换的数据都在这个连接里传输。连接可以是按需连接,调用结束后就断掉,也可以是长连接,多个远程过程调用共享一个连接。
第二,要解决寻址问题,也就是说,A 服务器上的应用怎么告诉底层 RPC 框架,如何连接到 B 服务器以及特定端口,这样才能完成调用。
第三,当 A 服务器上的应用发起远程调用时,方法的参数需要通过底层的网络协议如 TCP 传递到 B 服务器,由于网络协议是基于二进制的,内存中的参数的值要序列化成二进制的形式,也就是序列化或编组,通过寻址和传输将序列化的二进制发送给 B 服务器。
第四,B 服务器收到请求后,需要对参数进行反序列化(序列化的逆操作),恢复内存中的表达方式,然后找到对应的方法(寻址的一部分)进行本地调用,然后得到返回值。
第五,返回值还要发送回服务器 A 上的应用,也要经过序列化的方式发送,服务器 A 接到后,在反序列化,恢复为内存中的表达方式,交给服务器上的应用

nacos
- Nacos 是 SpringcloludAlibaba 架构中的重要组件
- 是一个更易于帮助构建云原生应用的动态服务发现,配置和服务管理平台,提供注册中心等功能
- 在服务中配置好 nacos 之后可以在页面中可视化的监控到服务
- 具体 nacos 可以参考官方文档 nacos官方文档
gateWay
在 微服务 架构中,服务的粒度被进一步细分,各个业务服务可以被独立的设计、开发以及管理。这时,各个独立部署单元可以用不同的开发测试团队维护,可以使用不同的编程语言和技术平台进行设计,这就要求必须使用一种语言和平台无关的服务协议作为各个单元间的通讯方式

API 网关的定义
网关的角色是作为一个 API 架构,用来保护、增强和控制对于 API 服务的访问。API 网关是一个处于应用程序或服务之前的系统,用来管理授权,访问控制和流量限制等,这样 REST API 接口服务就被 API 网关保护起来,对所有的调用者透明。因此隐藏在 API 网关后面的业务系统就可以专注于创建和管理服务,而不用去处理这些策略性地基础设施
最重要地几个概念

具体在项目中的实施
第一步 分析项目,拆分模块
我们首先将项目进行模块化的划分,划分如下
electronic-admin —— 业务:管理员模块
electronic-common —— 系统公共模块
electronic-data —— 业务:数据大屏模块
electronic-gateway —— GateWay 路由网关
electronic-openid —— 业务:微信模块
electronic-praise —— 业务:祝福模块
electronic-healthinfo —— 业务:健康码模块
electronic-student —— 业务:用户模块
第二部 编写配置文件,启动各个模块
编写 yml 配置文件
业务模块
server:port: 8985 # 模块端口号max-http-header-size: 20480
spring:application:name: API-XXXX # 模块名称,此模块名称将会在 nacos 中显示出来cloud:nacos:server-addr: xx.xx.xx.142:8848 # nacos 配置服务地址datasource:type: com.alibaba.druid.pool.DruidDataSource # 连接数据库driver-class-name: com.mysql.jdbc.Driverurl: jdbc:mysql://127.0.0.1:3306/xxxxxx?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=false&allowPublicKeyRetrieval=trueusername: rootpassword: ******
上面是最基本的业务模块的配置
gateWay 网关 yml 配置
server:port: 8096spring:application:name: API-GATEWAYcloud:nacos:server-addr: xx.xx.xx.142:8848 # 将网关注册到 nacosgateway:routes:- id: admin_routeruri: lb://API-ADMIN # 管理员模块predicates:- Path=/api/admin/**filters:- id: data_routeruri: lb://API-DATA # 数据大屏模块predicates:- Path=/api/ScreenData/**filters:- id: student_routeruri: lb://API-STUDENT # 用户模块predicates:- Path=/api/students/**, /api/studentsFeign/**filters:- id: student_routeruri: lb://API-HEALTH # 健康码模块predicates:- Path=/api/health/**filters:
解释:
url:使用 uri 是为了匹配后提供服务的路由地址,我们将所有的服务注册到 nacos 之后,通过访问接口 gateWay 就会在nacos 找到对用的服务进行转发
predicates:断言,路径相匹配的进行路由,这是必须要添加的配置
通过配置 gateWay,最明显的感受就是,我们有多个微服务,那么就会对应多个端口号,在请求接口时如果不配置 gateWay 那么端口号就太多太多,不利于管理。配置 gateWay 服务之后就可以进行统一管理,gateWay 暴露一个端口,然后进行转发,只需要请求gateWay暴露的端口号即可。
服务间的通信
服务间的通信有多种方式,比如 restemplate,openFeign,dubbo等,本次使用的是 OpenFeign。
在开发过程中我们很大程度上需要服务之间的通信,接下来看实现方式
第一步: 引入openfeign 依赖
<!--openfeign-->
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
使用 openfeign 需要在服务的启动类上开启 openfeign 使用注解 @EnableFeignClients
这里我们通过 数据大屏 与 用户 之间的通信演示
假设数据大屏中要显示 最近 num 条的用户注册的数据
Data 大数据模块
Controller 层
@GetMapping("/recentData")
public ResponseResult<List<RecentRegisterDataDto>> getRecentData(@RequestParam(defaultValue = "0") int num ){List<RecentRegisterDataDto> studentsServiceRecentData = studentsService.findRecentData(num);return ResponseResult.ok(studentsServiceRecentData);}
Feign:StudentFeign —— 这个可以写在了 service 层
@Component
@FeignClient(value = "API-STUDENT") // 表明是哪个服务的接口
public interface StudentsService {@GetMapping("/api/studentsFeign/recentData")List<RecentRegisterDataDto> findRecentData(@RequestParam("num") int num);
}
学生用户模块
在此模块中我们只需要给其开发一个接口即可
@GetMapping("recentData")
public List<RecentRegisterDataDto> findRecentData(@RequestParam("num") int num) {return studentsFeignService.findRecentData(num);
}
通过这样的方式,就可以实现两个模块之间的通信,在模块通信的过程中,如果有基本类型参数就需要加上 @RequestParam 注解,如果参数是对象的形式,使用 @RequestBody 注解
最基本的将微服务系统正常启动起来就以上所属。
相关文章:
微服务架构第一阶段(nacos,gateWay,RPC)
最近在学习完 springcloud 微服务架构之后,自己用了之前的一个项目计划拆分成微服务的项目,第一阶段要求整合 nacos,RPC以及gateWay,首先来看一下几个技术组件的概念 RPC RPC 框架 —— 远程过程调用协议RPC(Remote …...
【Azure 架构师学习笔记】-Azure Data Factory (5)-Managed VNet
本文属于【Azure 架构师学习笔记】系列。 本文属于【Azure Data Factory】系列。 接上文【Azure 架构师学习笔记】-Azure Data Factory (4)-触发器详解-事件触发器 前言 PaaS服务默认都经过公网传输, 这对很多企业而言并不安全,那么就需要对其进行安全改…...
ActiveMQ(三)
协议配置 ActiveMQ 支持的协议有 TCP 、 UDP、NIO、SSL、HTTP(S) 、VM 这是activemq 的activemq.xml 中配置文件设置协议的地方 <transportConnector name"openwire" uri"tcp://0.0.0.0:61616?maximumCon nections1000&wireFormat.maxFrameSiz…...
区块链多方计算 人工智能学习笔记
区块链:让数据不被篡改,但需要复制数据给每一块,造成数据泄露 多方计算 : 让数据用途可控。数控可用但不可见。 人工智能:数据更难造假 主讲人简介: 徐葳,宾夕法尼亚大学学士(在清华…...
基于opencv的边缘检测方法
1、梯度运算 用OpenCV的形态变换( 膨胀、腐蚀、开运算和闭运算)函数morphologyEx 梯度运算即膨胀结果-腐蚀结果: 【注意】对于二值图像来说,必须是前景图像为白色,背景为黑色,否则需要进行反二值化处理 …...
视频封装格式篇(TS)
本篇介绍下TS的封装格式。 1.什么是TS? TS(Transport Stream,传输流),一种常见的视频封装格式,是基于MPEG-2的封装格式(所以也叫MPEG-TS),后缀为.ts。 2.TS的分层结构 …...
静态路由+DHCP实验(四路由器八PC)
一.200.1.1.0/24子网划分 1.划分八个子网 2.选用前5个,第五个子网再划分4个子网作为骨干 二.规划路由 三.配置(下一跳) 1.先依次实现四个路由器之间全网可通 2.为路由器配置地址池,使用全局模式获取dhcp,指定网关…...
数据挖掘(作业汇总)
目录 环境配置 实验1 数据 作业2 环境配置 实验开始前先配置环境 以实验室2023安装的版本为例: 1、安装anaconda:(anaconda自带Python,安装了anaconda就不用再安装Python了) 下载并安装 Anaconda3-2022.10-Windows-x86_64.ex…...
基于微信小程序的图书馆选座系统源码
开发环境及工具: 大等于jdk1.8,大于mysql5.5,idea(eclipse),微信开发者工具 技术说明: springboot mybatis 小程序 代码注释齐全,没有多余代码,适合学习(…...
K8S 三种探针 readinessProbe、livenessProbe和startupProbe
一、POD状态 Pod 常见的状态 Pending:挂起,我们在请求创建pod时,条件不满足,调度没有完成,没有任何一个节点能满足调度条件。已经创建了但是没有适合它运行的节点叫做挂起,这其中也包含集群为容器创建网络…...
Android 设置背景颜色透明度
前言 本章是对设计给出的颜色做透明度的处理 原因 一般情况下我们是不需要做处理的,那为什么又需要我们做透明度呢,原因就是咱们的设计小哥哥、小姐姐们没有自己做处理,如果处理了的话,我们直接使用设计标注的AHEX颜色就行&a…...
聚类算法层次聚类
###cluster.py #导入相应的包 import scipy import scipy.cluster.hierarchy as sch from scipy.cluster.vq import vq,kmeans,whiten import numpy as np import matplotlib.pylab as plt #生成待聚类的数据点,这里生成了20个点,每个点4维: pointsscipy.randn(20,4) #加一…...
js 数据类型
1.概念 数据类型指的是可以在程序中存储和操作的值的类型,每种编程语言都有其支持的数据类型,不同的数据类型用来存储不同的数据,例如文本、数值、图像等。 JavaScript 是一种动态类型的语言,在定义变量时不需要提前指定变量的类…...
多级评论单表结构设计
这里的多级,本质上其实也就二级,例如微博的评论, 一级评论: 对微博的评论 二级评论: 对微博下的评论的回复评论 ,这里包括二种 1. 回复的是一级评论, 2, 回复的是二级评论 效果如下 表数据 查…...
Mac M1通过VMWare Fusion安装Centos7记录(镜像和网络有大坑)
以前用linux系统基本都在我的服务器上或者是在win上进行,从没有在M1上进行创建,因此走了一些坑吧,这里会列出我的详细安装步骤。 下载镜像 镜像的下载网站:https://www.centos.org/download/ 在该网站中,不管是Every…...
女生适合当程序员吗?
在这个节日里,让我们来讨论一个比较热门的话题吧。女生到底适不适合当程序员? 在开启这个话题前,我们先来认识一位伟大的女性吧。 阿达洛芙莱斯(Augusta Ada King)是著名英国诗人拜伦之女,她本职是一位数…...
昇腾AI机器人发布,12家企业、5家高校签约,昇腾AI开发者创享日全国巡展沈阳首站成功举办
“创未来,享非凡”昇腾AI开发者创享日2023年全国巡回首站活动成功举办,本次活动由辽宁省科技厅指导,由沈阳市科技局、浑南区人民政府、沈阳高新区管理委员会、华为技术有限公司共同主办,沈阳昇腾人工智能生态创新中心承办…...
anaconda如何改变虚拟环境安装路径
1、查看anaconda的环境配置(对应结果如下图所示) conda config --show 或者 conda info 查看虚拟环境安装位置的结果如上图所示 2、修改配置语法 conda config --add key value #添加语法 conda config --remove key value #删除语法 其中࿰…...
根据卫星运动矢量计算轨道六根数
前言 STK软件在给定六根数时,可求得卫星位置和速度矢量,但有时我们通过星历参数得到卫星的位置和速度矢量,希望能够反演得出卫星轨道的六根数。从而方便对该卫星轨道进行仿真模拟。 计算过程 给定卫星在J2000坐标系下的的位置矢量r和速度矢…...
关于微信小程序安装npm的过程,从下载到小程序内部安装完成
1.先从官网下载nodejs 网站为Node.js (nodejs.org),选择左边第一个2 然后一直next,选默认就行 选择自己喜欢的路径我的是D:\nodejs-v18.12.1 3 下载完成后,先在安装文件夹中新建两个文件夹 node_cache node_global 4 配置一下环境变量&…...
定制你的专属探针:PEG-锰基纳米材料,为精准科研而生
在纳米生物医学研究的前沿,标准化的材料往往难以完全契合你的实验设想。你是否正在为TME响应成像、MRI造影增强、化学动力学Treatment 或药物递送系统的构建而寻找一种可调控、生物相容性良好的纳米平台?现在,你可以完全掌控参数——PEG-锰基…...
AI Agents 越智能,企业的人类判断力需求反而会爆炸式增长:Jevons 悖论在企业落地中的隐形反弹
在企业全面拥抱 AI Agents 的当下,最容易被忽略的不是模型能力,而是“智能变便宜”之后带来的责任边界扩张。产品团队让 Agent 自动起草客户邮件、更新工单、标记流失风险、总结销售通话、推荐代码变更、升级支持问题、准备决策材料——每一步都变得前所…...
基于sagents框架的AI智能体开发:从核心原理到实战应用
1. 项目概述:一个面向开发者的AI智能体构建框架最近在AI应用开发圈子里,一个名为sagents的开源项目开始引起不少同行的注意。如果你正在寻找一个能帮你快速构建、测试和部署AI智能体(Agent)的框架,而不是从零开始造轮子…...
PhonePi-MCP:基于MCP协议实现AI智能体自动化操控Android手机
1. 项目概述:当你的手机成为AI的“眼睛”与“双手” 最近在折腾AI智能体(Agent)时,我一直在思考一个问题:如何让这些运行在云端或本地电脑上的“大脑”真正地与现实世界互动?比如,让它帮我查一…...
Arm Neoverse CMN-650错误处理与事务管理机制解析
1. Arm Neoverse CMN-650错误处理机制深度解析在现代多核处理器系统中,错误处理机制的设计直接影响着系统的可靠性和稳定性。Arm Neoverse CMN-650作为一款高性能一致性网状网络,其错误处理架构展现了精妙的设计理念。1.1 HN-I节点的错误分类与处理HN-I&…...
代码审查时最该关注的不是语法,而是这五个“坏味道”
“这段代码能跑,但总觉得哪里不对劲。”如果你在审查代码时有过这种感觉,说明你已经嗅到了代码的坏味道。作为软件测试从业者,我们往往比开发人员更早感受到坏味道带来的痛苦——一个看似简单的变更导致回归测试大面积失败,一个边…...
Dell R630服务器RAID实战:8块硬盘如何混搭RAID1和RAID0?保姆级图文教程
Dell R630服务器混合RAID配置实战:系统盘与数据盘的黄金分割方案 在企业级IT基础设施中,存储配置的灵活性与可靠性往往决定着整个系统的稳定边界。当一台Dell PowerEdge R630服务器配备8块硬盘时,如何通过RAID技术的组合拳实现系统安全与数据…...
12 - AI Native“基因测序法”:你的产品是“数字生命”还是“行尸走肉”?
本专题系列文章共 28 篇 01 - 眩晕时代的定海神针:大模型落地的“第一性原理”与算力丰裕悖论 02 - 95%的AI投资打了水漂:五大错配如何扼杀你的“第二增长曲线”...
FPGA上LUT-DNN稀疏连接优化技术SparseLUT详解
1. 项目概述在边缘计算场景中,FPGA因其可重构性和低功耗特性成为部署深度神经网络(DNN)的理想平台。然而传统DNN在FPGA上的实现面临资源占用高、延迟大等挑战。基于查找表(LUT)的DNN通过将神经元计算映射到FPGA原生LUT资源,显著提升了硬件效率。但现有LU…...
构建AI涌现式判断系统:从智能体工作流到技术评审实践
1. 项目概述:当AI学会“判断”而非“计算”最近在GitHub上看到一个名为“emergent-judgment”的项目,由thebrierfox发起。初看标题,你可能会觉得这又是一个关于AI伦理或决策系统的抽象讨论。但深入探究后,我发现它指向了一个更具体…...
