想必这个题目就让人很头疼,我刚拿到这个需求的时候也是真的懵逼。原始需求是需要让我把内网开发后的项目部署后实现互联网可访问。背景:公司是军工企业,内部所有的开发环境都不允许连接互联网,且仅留出几个IP通过中继做到内网网段后进行远程上网或代理上网。那么一头雾水的我开始了撞南墙模式。尝试了很久搞出了一套适合公司内部的部署方式......心累......
1、实现内网服务器中继
针对需求做了认真的分析后发现直接将当前项目部署至互联网服务器上是最方便最稳妥的方案(天真脸*_*),但是提交接入互联网的申请后被驳回,上级认为这样安全性就得不到保证,最重要的数据源需要保密存储不能部署到外网。那这样的话除了通过将服务部署至数据库所在网段外别无它法。无线中继原理
但分析业务后得出结论数据库所在网段无法直连互联网。因此只能促使我使用中继服务将其与互联网的网段通过专用交换机连接,之后再通过非常给力的运营部小伙伴的协助进行了注册,成功将研发网段中继到了有权限访问外网的IP上。但是该IP经过验证分析直接接通互联网也存在安全隐患,因此又进行了外网的端口映射,最终占据映射的端口才得以将内网服务展示到外网并实现访问数据及openlayer数据图层。(以上的分析因为没有样例项目做对照,所以存在闭门造车的嫌疑,还望大神指出不足)
可行性分析与技术论证完成了,接下来就要开始项目的打包部署了,由于开发过程是在windows环境下进行的,而部署服务器为linux环境,因此我们所有的微服务都建议打成jar包。不使用war包的原因是SpringBoot的每项微服务在jar包中均自带tomcat可随jar包的启动而启动,而且jar包执行方便。因此为何使用jar包就不言而喻了。
2、服务配置及打包
以本篇为例,共需要六项服务为整体项目提供支持,它们分别为SpringEurake平台,gateway路由分发服务,configcenter注册中心,tail消费者服务,service接口提供服务,react前端服务这六项。假如需要构建新的数据源可以参照下方的文章:兔先森:SpringBoot配置pg新数据源及接口开发手册zhuanlan.zhihu.com
这篇文章实现了在同网段下进行新数据源的配置,同时实现了新的数据接口,构建新数据源存在问题时可以参考下。
其中需要配置的文件为application.yml或者bootstrap.yml,路径在根目录下的resource文件夹下。
SpringEurake平台的配置内容如下所示:
spring:
application:
name: eureka-service
server:
port: 7070
eureka:
client:
register-with-eureka: false
fetch-registry: false
instance:
hostname: shipTail1
server:
enable-self-preservation: false
eviction-interval-timer-in-ms: 4000
以上是SpringEurake平台的配置内容,需要注意端口号不要占用映射的端口,平台服务不需要配置IP。
configcenter注册中心配置如下:
spring:
application:
name: configCenterService
#执行使用SVN
profiles:
active: subversion
cloud:
config:
server:
svn:
uri: https://1.1.1.1/svn/web/shiptail/configProperties
username: anzp
password: anzp
#指定svn目录下的某个文件夹作为配置仓库 默认为trunk
default-label: config
server:
port: 7078
eureka:
client:
serviceUrl:
# defaultZone: http://mq:7070/eureka/,http://mongodb:7070/eureka/
注册中心需要注意服务端口不要占用映射端口,同时与其他端口要保持差异性。服务IP在本例中做了类分布式处理。最后部署到外网服务器需要将serviceUrl改为部署到的外网IP(要严格准确)。
gateway服务分发中心配置如下:
spring:
application:
name: gateway
server:
port: 7075
zuul:
routes:
api-a:
path: /shiptail/service/**
service-id: shipTail
api-b:
path: /shiptail/weball/**
service-id: shipHtml
api-c:
path: /shiptail/indeed/**
service-id: cargoHtml
max:
host:
connections: 500
host:
socket-timeout-millis: 60000
connect-timeout-millis: 60000
eureka:
client:
serviceUrl:
#defaultZone: http://mongodb:7070/eureka/,http://mongodb2:7070/eureka/,http://mq:7070/eureka/
##timeout config
hystrix:
command:
default:
execution:
timeout:
enabled: true
isolation:
thread:
timeoutInMilliseconds: 60000
ribbon:
ReadTimeout: 60000
ConnectTimeout: 60000
MaxAutoRetries: 0
MaxAutoRetriesNextServer: 1
eureka:
enabled: true
需要注意的是要为前端项目预留出前端项目的部署路径path: /shiptail/indeed/**(服务访问地址与path一致),服务名称service-id: cargoHtml,也要注意端口不要占用映射端口,同时与其他端口不要相同。 serviceUrl也要配置成部署到的外网IP!
tail消费者服务配置如下
spring:
application:
name: shipTail
datasource:
driverClassName: org.postgresql.Driver
url: jdbc:postgresql://1.1.1.1:5432/postgres
username: postgres
password: postgres
jackson:
default-property-inclusion: non_null
server:
port: 9072
# tomcat:
# max-threads: 50
eureka:
client:
serviceUrl:
#defaultZone: http://mongodb:7070/eureka/,http://mongodb2:7070/eureka/
instance:
prefer-ip-address: true
feign:
hystrix:
enabled: true
# compression:
# request:
#enabled: true # 配置请求GZIP压缩
# mime-types: text/xml,application/xml,application/json
# min-request-size: 2048
#response:
#enabled: true # 配置响应GZIP压缩
# min-request-size: 2048
client:
config:
feignName:
connectTimeout: 10000
readTimeout: 10000
hystrix:
command:
default:
execution:
timeout:
enabled: true #执行是否启用超时
isolation:
thread:
timeoutInMilliseconds: 10000 #命令执行超时时间
ribbon:
ReadTimeout: 60000
ConnectTimeout: 60000
也要注意端口不要占用映射端口,同时与其他端口保持差异性。 serviceUrl也要配置成部署到的外网IP!
service接口提供服务配置如下:
spring:
application:
name: NewshipcargoService
cloud:
config:
profile: dev
uri: http://1.1.1.1:7078/
label: config
name: application
jackson:
default-property-inclusion: NON_NULL
server:
port: 8029
eureka:
client:
serviceUrl:
#defaultZone: http://mq:7070/eureka/,http://mongodb:7070/eureka/
instance:
prefer-ip-address: true
也要注意端口不要占用映射端口,同时与其他端口保持差异。 serviceUrl也要配置成部署到的外网IP!重要的事情说三遍......
react前端服务配置如下:
spring:
application:
name: cargoHtml
server:
port: 7077
eureka:
client:
serviceUrl:
# defaultZone: http://mongodb:7070/eureka/,http://mongodb2:7070/eureka/,http://mq:7070/eureka/
前端服务特别要注意的是application下的name需要和gateway下面的service-id一致,同时要注意端口不要占用映射端口,同时与其他端口保持差异。 serviceUrl也要配置成部署到的外网IP!重要的事情说n遍......
到此为止,所有的服务就已经配置完成了。
3、项目打包及部署
在配置了私服后,我们可以通过右键项目选择Run As,再选择Maven Install进行项目打包,打包模式为jar包。本次操作需要将本地文件拷贝到局域网内的其他服务器上,因为本地研发网段11与10均为1网段的中继,因此可以通过scp命令进行文件传输,将打完的jar包传输至数据库所在网段的服务器上,命令为
把当前一个文件copy到其他服务器的指定文件夹下:
scp /home/******.jar root@192.168.1.1:/home/root
同时假如安装了xftp5的话,可以连接到指定服务器,打开指定路径可视化工具将jar包拖入即可。移动六项服务后的结果如下所示:
随后通过
java -jar *************.jar
命令即可启动项目。
假如想要服务的执行保证可持续化可以使用
nohup java -jar **************.jar
命令启动项目,这样项目就可在后台持续运行,命令行中断项目也不会终止项目的运行,除非使用命令杀死占用相应端口的进程。
至此我的服务就已经部署到做了映射的中继服务器上,外网可以持续访问。其实难点不多,困扰作者的只是经验太少,没有一个能指路的老师。不过我相信越努力,越幸运,不要被环境影响改变自己的初心。部署顺利
Happy Hacking!