项目后端脱敏后已在Github Public
GitHub - izyq/flooding: 油田注水综合评价系统
总体架构
网络结构
个人总结
从最开始的需求分析、系统设计数据库设计,再到后端架构和代码的编写,每个环节我让我学习到了新的知识。方向比速度更重要,我认识到前期的调研和需求分析的至关重要,如果不把业务理解透彻,那么写再多的代码都是在做无用功。之前我对微服务只是浅尝辄止,但是通过该项目,我对微服务的架构、意义有了更加深入的理解,我想在此谈谈我的认识。
在本项目中,整合了Spring Security、Spring Gateway、Spring Cloud、Dubbo以及加上nacos注册中心这样的微服务生态,通过对这些模块的整合我更加理解他们之间是如何协同运作的,首先网关是是服务的第一入口,在它上面做的事情很多。我们在网关配置好的相关路由后,比如对于网关识别到/api后缀,会对请求进行转发,向相关服务发出请求。在这里,我还将spring-cloud-starter-loadbalancer整合进了网关层,网关在收到请求后,会向nacos注册中心获取所有健康的集群的实例,并对向他们发出的请求实施负载均衡。当然,网关在向服务层发起请求之前,还有一件重要的事情,就是对用户发出的请求进行统一鉴权,通过解析JWT的token,获取到请求用户的信息和对应的权限信息,如果权限不足则直接返回,权限满足的情况下,又如何让业务层知道该请求是由哪个用户发出的呢,本项目中我们将在网关层通过token解析出来的用户信息再打到向业务层转发的请求的header上,业务层通过对http request header的读取,解析出用户相关信息,并对用户进行的操作进行记录。除此之外,网关在返回业务层数据的时候,也可以进行处理,对不符合统一响应的返回数据进行包装,对异常信息做同一处理。所以其实讲网关说成是一个过滤器链执行框架也不为过。
接下来再说一下动态配置,像网关这种服务,作为所有请求的入口,必须保持高可用性。那么如果有新业务上线,需要添加新的路由,或者需要修改已有的路由时,每次都要重启网关服务吗?答案是否定的,这时候又是nacos发挥作用的时候了,nacos可以对各个服务进行动态配置,在需要进行动态配置的服务引入spring-cloud-starter-alibaba-nacos-config依赖,再对nacos连接进行相关配置即可生效。当我们需要对网关加入一条新的路由时,只需在nacos中修改配置并发布,服务端监听到配置变更,便会加载变更。
项目介绍
注水井开发效果综合评价系统软件是用于评估注水井在油田开发中的效果的工具。它结合了数据分析、模型计算和可视化展示等技术,通过对注水井运行数据的处理和分析,提供全面、准确的评价结果,帮助油田管理者和工程师做出科学决策。
以下是该系统软件的实现技术和特点:
- 数据采集与处理:系统软件通过与注水井监测设备的连接,实时采集注水井的运行数据,包括注水压力、注水流量、注入液体的成分等。同时,对采集到的数据进行预处理,包括数据清洗、异常值处理和数据归一化等,确保数据的准确性和可靠性。
- 模型建立与计算:系统软件基于油田注水井的工程原理和流体力学模型,建立评价模型。通过对采集到的数据进行模型计算,评估注水井的效果。常用的模型包括注入水体的扩散模型、压裂模型、地层渗流模型等。根据实际情况和需求,可以采用不同的模型进行评价,并结合多种模型结果进行综合分析。
- 数据分析与可视化展示:系统软件通过数据分析算法,对模型计算结果进行综合分析,提取关键指标和特征。同时,采用图表、曲线和地图等可视化手段,将评价结果以直观的形式展示出来。这样可以帮助用户更好地理解评价结果,发现潜在问题和趋势,做出相应的调整和决策。
- 数据管理与报告生成:系统软件提供数据管理功能,可以对注水井的历史数据进行存储和管理,便于用户查阅和比对不同时间段的数据。同时,系统软件还可以生成详细的评价报告,包括评价结果、关键指标分析、图表和曲线展示等,帮助用户进行全面的分析和决策。
该系统软件的特点如下:
- 综合评价能力:系统软件综合考虑了注水井的多个因素和指标,包括注水效率、注水范围、注入液体的分布等,从多个维度评价注水井的开发效果。这样可以全面了解注水井的运行情况,及时发现问题并采取相应措施。
- 实时性和准确性:系统软件可以实时采集和处理注水井的数据,并进行实时计算和分析,提供及时准确的评价结果。这样可以及时发现问题和异常,避免潜在的风险和损失。
- 用户友好性:系统软件提供简洁直观的用户界面,操作简便,易于使用。同时,通过可视化展示和报告生成,使得评价结果易于理解和传达,方便用户做出决策。
- 可定制性和扩展性:系统软件可以根据不同油田的实际情况和需求进行定制和调整。同时,具备良好的扩展性,可以集成更多的评价模型和算法,以适应不断变化的需求和技术发展。
- 注水井开发效果综合评价系统软件通过数据采集、模型计算、数据分析和可视化展示等技术,帮助油田管理者和工程师全面评估注水井的效果,并做出科学决策,提高油田开发的效率和效果。
记录
Nacos 单机运行
docker run -d \
--name nacos-standalone \
-e PREFER_HOST_MODE=hostname \
-e MODE=standalone \
-e JVM_XMS=256m \
-e JVM_XMX=256m \
-v /root/nacos-server/logs/:/home/nacos/logs \
-p 8848:8848 \
nacos/nacos-server:1.4.2
Docker部署的Spring Cloud微服务注册到Nacos的IP为私网无法访问
在Nacos中让服务使用指定网段ip注册 - Lucent’s Blog
Docker部署的Spring Cloud微服务注册到Nacos的IP为私网无法访问 - 有来技术 - 博客园
指定IP
spring:
cloud:
nacos:
discovery:
ip: 192.144.220.153
设置主机模式
docker run -d --network=host --restart=always
指定网段IP注册
cloud:
inetutils:
ignored-interfaces: eth.*
preferred-networks:
- 192.168
- 192
查看docker桥接模式网络配置后,发现这种方式应该是没用的
eth0 Link encap:Ethernet HWaddr 02:42:AC:11:00:03
inet addr:172.17.0.3 Bcast:172.17.255.255 Mask:255.255.0.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:1038533 errors:0 dropped:0 overruns:0 frame:0
TX packets:1226213 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:379406899 (361.8 MiB) TX bytes:397027737 (378.6 MiB)
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
UP LOOPBACK RUNNING MTU:65536 Metric:1
RX packets:4 errors:0 dropped:0 overruns:0 frame:0
TX packets:4 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:288 (288.0 B) TX bytes:288 (288.0 B)
Disconnected from container.
NACOS 鉴权
添加 -e NACOS_AUTH_ENABLE=true
Authorization
Dubbo
注册到注册中心的地址是内网IP
可以通过dubbo.protocol或dubbo.provider的host属性对host进行配置,支持IP地址和域名.但此时注册到注册中心的IP地址和监听IP地址是同一个值
为了解决在虚拟环境或局域网内consumer无法与provider通信的问题,可以通过环境变量分别设置注册到注册中心的IP地址和监听IP地址,其优先级高于dubbo.protocol或dubbo.provider的host配置
通过docker运行
-e DUBBO_IP_TO_REGISTRY=公网IP
-p 9005:9005 -p 20880:20880
ENV TZ=Asia/Shanghai
ENV DUBBO_IP_TO_REGISTRY=公网IP
获取不到Bean
原本在单体项目中是这样
使用SpringUtils.getBean
SpringUtils.getBean
需要具体实现,可以在网上搜
IWellService wellService = SpringUtils.getBean(IWellService.class);
微服务进行了拆分所以会报错
实现DubboBean.getDubboBean
方法,解决
IWellService wellService = DubboBean.getDubboBean(IWellService.class);
package club.cupk.waterflood.util;
import org.apache.dubbo.config.spring.ReferenceBean;
import org.apache.dubbo.config.spring.beans.factory.annotation.ReferenceAnnotationBeanPostProcessor;
import xin.altitude.cms.common.util.SpringUtils;
import java.util.Collection;
public class DubboBean {
public static <T> T getDubboBean(Class<T> requiredType){
ReferenceAnnotationBeanPostProcessor dubboContext = SpringUtils.getBean(ReferenceAnnotationBeanPostProcessor.class);
Collection<ReferenceBean<?>> referenceBeans = dubboContext.getReferenceBeans();
for (ReferenceBean<?> referenceBean : referenceBeans) {
Class<?> objectType = referenceBean.getObjectType();
if(objectType == requiredType){
return (T)referenceBean.getObject();
}
}
return null;
}
}
Wrapper
警告:
不支持以及不赞成在 RPC 调用中把 Wrapper 进行传输
- wrapper 很重
- 传输 wrapper 可以类比为你的 controller 用 map 接收值(开发一时爽,维护火葬场)
- 正确的 RPC 调用姿势是写一个 DTO 进行传输,被调用方再根据 DTO 执行相应的操作
- 我们拒绝接受任何关于 RPC 传输 Wrapper 报错相关的 issue 甚至 pr
Spring Cloud Gateway负载均衡
Spring Cloud Gateway负载均衡 - 简书
Spring Cloud Gateway整合Nacos实现服务路由及集群负载均衡_gateway nacos 负载均衡_凌波漫步&的博客-CSDN博客
lb://lakerservice
不生效
加入依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>
用RouteRecordGlobalFilter记录路由后的实际代理地址
@Slf4j
@Component
public class RouteRecordGlobalFilter implements GlobalFilter, Ordered {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
// RouteToRequestUrlFilter会把实际路由的URL通过该属性保存
URI proxyRequestUri = exchange.getAttribute(ServerWebExchangeUtils.GATEWAY_REQUEST_URL_ATTR);
long start = System.currentTimeMillis();
return chain.filter(exchange).then(Mono.fromRunnable(() -> {
long end = System.currentTimeMillis();
log.info("实际调用地址为:{},调用耗时为:{}ms", proxyRequestUri, (end - start));
}));
}
@Override
public int getOrder() {
// 优先级设为最低,先让RouteToRequestUrlFilter先调用
return Ordered.LOWEST_PRECEDENCE;
}
}
YAML
Local
gateway:
discovery:
#开启负载均衡
locator:
enabled: true
#服务名小写
lower-case-service-id: true
loadbalancer:
use404: false
Nacos
spring:
cloud:
gateway:
# 允许跨域请求配置
globalcors:
cors-configurations:
'[/**]':
# 允许任何域名使用
allowedOrigins: "*"
# 允许任何头
allowedHeaders: "*"
# 允许任何方法(post、get等)
allowedMethods: "*"
# sessionid 多次访问一致
allowCredentials: true
# 允许来自所有域名(allowedOrigins)的所有请求方式(allowedMethods)发出CORS请求
add-to-simple-url-handler-mapping: true # 允许来自所有域名(allowedOrigins)的所有请求方式(allowedMethods)发出CORS请求
routes:
- id: waterflood-consumer
uri: lb://waterflood-consumer
predicates:
- Path=/api/**
filters:
- StripPrefix=1