当前位置: 首页 > news >正文

微服务架构第一阶段(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 微服务架构之后&#xff0c;自己用了之前的一个项目计划拆分成微服务的项目&#xff0c;第一阶段要求整合 nacos&#xff0c;RPC以及gateWay&#xff0c;首先来看一下几个技术组件的概念 RPC RPC 框架 —— 远程过程调用协议RPC&#xff08;Remote …...

【Azure 架构师学习笔记】-Azure Data Factory (5)-Managed VNet

本文属于【Azure 架构师学习笔记】系列。 本文属于【Azure Data Factory】系列。 接上文【Azure 架构师学习笔记】-Azure Data Factory (4)-触发器详解-事件触发器 前言 PaaS服务默认都经过公网传输&#xff0c; 这对很多企业而言并不安全&#xff0c;那么就需要对其进行安全改…...

ActiveMQ(三)

协议配置 ActiveMQ 支持的协议有 TCP 、 UDP、NIO、SSL、HTTP(S) 、VM 这是activemq 的activemq.xml 中配置文件设置协议的地方 <transportConnector name"openwire" uri"tcp://0.0.0.0:61616?maximumCon nections1000&amp;wireFormat.maxFrameSiz…...

区块链多方计算 人工智能学习笔记

区块链&#xff1a;让数据不被篡改&#xff0c;但需要复制数据给每一块&#xff0c;造成数据泄露 多方计算 &#xff1a; 让数据用途可控。数控可用但不可见。 人工智能&#xff1a;数据更难造假 主讲人简介&#xff1a; 徐葳&#xff0c;宾夕法尼亚大学学士&#xff08;在清华…...

基于opencv的边缘检测方法

1、梯度运算 用OpenCV的形态变换&#xff08; 膨胀、腐蚀、开运算和闭运算&#xff09;函数morphologyEx 梯度运算即膨胀结果-腐蚀结果&#xff1a; 【注意】对于二值图像来说&#xff0c;必须是前景图像为白色&#xff0c;背景为黑色&#xff0c;否则需要进行反二值化处理 …...

视频封装格式篇(TS)

本篇介绍下TS的封装格式。 1.什么是TS&#xff1f; TS&#xff08;Transport Stream&#xff0c;传输流&#xff09;&#xff0c;一种常见的视频封装格式&#xff0c;是基于MPEG-2的封装格式&#xff08;所以也叫MPEG-TS&#xff09;&#xff0c;后缀为.ts。 2.TS的分层结构 …...

静态路由+DHCP实验(四路由器八PC)

一.200.1.1.0/24子网划分 1.划分八个子网 2.选用前5个&#xff0c;第五个子网再划分4个子网作为骨干 二.规划路由 三.配置&#xff08;下一跳&#xff09; 1.先依次实现四个路由器之间全网可通 2.为路由器配置地址池&#xff0c;使用全局模式获取dhcp&#xff0c;指定网关…...

数据挖掘(作业汇总)

目录 环境配置 实验1 数据 作业2 环境配置 实验开始前先配置环境 以实验室2023安装的版本为例&#xff1a; 1、安装anaconda&#xff1a;&#xff08;anaconda自带Python,安装了anaconda就不用再安装Python了&#xff09; 下载并安装 Anaconda3-2022.10-Windows-x86_64.ex…...

基于微信小程序的图书馆选座系统源码

开发环境及工具&#xff1a; 大等于jdk1.8&#xff0c;大于mysql5.5&#xff0c;idea&#xff08;eclipse&#xff09;&#xff0c;微信开发者工具 技术说明&#xff1a; springboot mybatis 小程序 代码注释齐全&#xff0c;没有多余代码&#xff0c;适合学习&#xff08;…...

K8S 三种探针 readinessProbe、livenessProbe和startupProbe

一、POD状态 Pod 常见的状态 Pending&#xff1a;挂起&#xff0c;我们在请求创建pod时&#xff0c;条件不满足&#xff0c;调度没有完成&#xff0c;没有任何一个节点能满足调度条件。已经创建了但是没有适合它运行的节点叫做挂起&#xff0c;这其中也包含集群为容器创建网络…...

Android 设置背景颜色透明度

前言 本章是对设计给出的颜色做透明度的处理 原因 一般情况下我们是不需要做处理的&#xff0c;那为什么又需要我们做透明度呢&#xff0c;原因就是咱们的设计小哥哥、小姐姐们没有自己做处理&#xff0c;如果处理了的话&#xff0c;我们直接使用设计标注的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.概念 数据类型指的是可以在程序中存储和操作的值的类型&#xff0c;每种编程语言都有其支持的数据类型&#xff0c;不同的数据类型用来存储不同的数据&#xff0c;例如文本、数值、图像等。 JavaScript 是一种动态类型的语言&#xff0c;在定义变量时不需要提前指定变量的类…...

多级评论单表结构设计

这里的多级&#xff0c;本质上其实也就二级&#xff0c;例如微博的评论&#xff0c; 一级评论&#xff1a; 对微博的评论 二级评论&#xff1a; 对微博下的评论的回复评论 &#xff0c;这里包括二种 1. 回复的是一级评论&#xff0c; 2, 回复的是二级评论 效果如下 表数据 查…...

Mac M1通过VMWare Fusion安装Centos7记录(镜像和网络有大坑)

以前用linux系统基本都在我的服务器上或者是在win上进行&#xff0c;从没有在M1上进行创建&#xff0c;因此走了一些坑吧&#xff0c;这里会列出我的详细安装步骤。 下载镜像 镜像的下载网站&#xff1a;https://www.centos.org/download/ 在该网站中&#xff0c;不管是Every…...

女生适合当程序员吗?

在这个节日里&#xff0c;让我们来讨论一个比较热门的话题吧。女生到底适不适合当程序员&#xff1f; 在开启这个话题前&#xff0c;我们先来认识一位伟大的女性吧。 阿达洛芙莱斯&#xff08;Augusta Ada King&#xff09;是著名英国诗人拜伦之女&#xff0c;她本职是一位数…...

昇腾AI机器人发布,12家企业、5家高校签约,昇腾AI开发者创享日全国巡展沈阳首站成功举办

“创未来&#xff0c;享非凡”昇腾AI开发者创享日2023年全国巡回首站活动成功举办&#xff0c;本次活动由辽宁省科技厅指导&#xff0c;由沈阳市科技局、浑南区人民政府、沈阳高新区管理委员会、华为技术有限公司共同主办&#xff0c;沈阳昇腾人工智能生态创新中心承办&#xf…...

anaconda如何改变虚拟环境安装路径

1、查看anaconda的环境配置&#xff08;对应结果如下图所示&#xff09; conda config --show 或者 conda info 查看虚拟环境安装位置的结果如上图所示 2、修改配置语法 conda config --add key value #添加语法 conda config --remove key value #删除语法 其中&#xff0…...

根据卫星运动矢量计算轨道六根数

前言 STK软件在给定六根数时&#xff0c;可求得卫星位置和速度矢量&#xff0c;但有时我们通过星历参数得到卫星的位置和速度矢量&#xff0c;希望能够反演得出卫星轨道的六根数。从而方便对该卫星轨道进行仿真模拟。 计算过程 给定卫星在J2000坐标系下的的位置矢量r和速度矢…...

关于微信小程序安装npm的过程,从下载到小程序内部安装完成

1.先从官网下载nodejs 网站为Node.js (nodejs.org)&#xff0c;选择左边第一个2 然后一直next&#xff0c;选默认就行 选择自己喜欢的路径我的是D:\nodejs-v18.12.1 3 下载完成后&#xff0c;先在安装文件夹中新建两个文件夹 node_cache node_global 4 配置一下环境变量&…...

从WWDC看苹果产品发展的规律

WWDC 是苹果公司一年一度面向全球开发者的盛会&#xff0c;其主题演讲展现了苹果在产品设计、技术路线、用户体验和生态系统构建上的核心理念与演进脉络。我们借助 ChatGPT Deep Research 工具&#xff0c;对过去十年 WWDC 主题演讲内容进行了系统化分析&#xff0c;形成了这份…...

2025 后端自学UNIAPP【项目实战:旅游项目】6、我的收藏页面

代码框架视图 1、先添加一个获取收藏景点的列表请求 【在文件my_api.js文件中添加】 // 引入公共的请求封装 import http from ./my_http.js// 登录接口&#xff08;适配服务端返回 Token&#xff09; export const login async (code, avatar) > {const res await http…...

uniapp中使用aixos 报错

问题&#xff1a; 在uniapp中使用aixos&#xff0c;运行后报如下错误&#xff1a; AxiosError: There is no suitable adapter to dispatch the request since : - adapter xhr is not supported by the environment - adapter http is not available in the build 解决方案&…...

docker 部署发现spring.profiles.active 问题

报错&#xff1a; org.springframework.boot.context.config.InvalidConfigDataPropertyException: Property spring.profiles.active imported from location class path resource [application-test.yml] is invalid in a profile specific resource [origin: class path re…...

SAP学习笔记 - 开发26 - 前端Fiori开发 OData V2 和 V4 的差异 (Deepseek整理)

上一章用到了V2 的概念&#xff0c;其实 Fiori当中还有 V4&#xff0c;咱们这一章来总结一下 V2 和 V4。 SAP学习笔记 - 开发25 - 前端Fiori开发 Remote OData Service(使用远端Odata服务)&#xff0c;代理中间件&#xff08;ui5-middleware-simpleproxy&#xff09;-CSDN博客…...

Pinocchio 库详解及其在足式机器人上的应用

Pinocchio 库详解及其在足式机器人上的应用 Pinocchio (Pinocchio is not only a nose) 是一个开源的 C 库&#xff0c;专门用于快速计算机器人模型的正向运动学、逆向运动学、雅可比矩阵、动力学和动力学导数。它主要关注效率和准确性&#xff0c;并提供了一个通用的框架&…...

4. TypeScript 类型推断与类型组合

一、类型推断 (一) 什么是类型推断 TypeScript 的类型推断会根据变量、函数返回值、对象和数组的赋值和使用方式&#xff0c;自动确定它们的类型。 这一特性减少了显式类型注解的需要&#xff0c;在保持类型安全的同时简化了代码。通过分析上下文和初始值&#xff0c;TypeSc…...

day36-多路IO复用

一、基本概念 &#xff08;服务器多客户端模型&#xff09; 定义&#xff1a;单线程或单进程同时监测若干个文件描述符是否可以执行IO操作的能力 作用&#xff1a;应用程序通常需要处理来自多条事件流中的事件&#xff0c;比如我现在用的电脑&#xff0c;需要同时处理键盘鼠标…...

【LeetCode】3309. 连接二进制表示可形成的最大数值(递归|回溯|位运算)

LeetCode 3309. 连接二进制表示可形成的最大数值&#xff08;中等&#xff09; 题目描述解题思路Java代码 题目描述 题目链接&#xff1a;LeetCode 3309. 连接二进制表示可形成的最大数值&#xff08;中等&#xff09; 给你一个长度为 3 的整数数组 nums。 现以某种顺序 连接…...

c++第七天 继承与派生2

这一篇文章主要内容是 派生类构造函数与析构函数 在派生类中重写基类成员 以及多继承 第一部分&#xff1a;派生类构造函数与析构函数 当创建一个派生类对象时&#xff0c;基类成员是如何初始化的&#xff1f; 1.当派生类对象创建的时候&#xff0c;基类成员的初始化顺序 …...