亲历的企业级微服务的完整构建过程-系列文章目录
本人参与了这次的企业级微服务的完整构建,想要记录下来以便以后复习,同时也想分享给小伙伴们,抛砖引玉,欢迎大家提出自己的意见和建议,大家一起探讨一起成长。以下为该系列所有文章的链接:
- 搭建和使用Maven私有仓库(Nexus)(更新中。。。)
- API网关(待发布)
- 认证中心(待发布)
- Redis框架(待发布)
- RabbitMQ(待发布)
- MyBatis(待发布)
- Web模块(待发布)
- 低代码(待发布)
- Core
- 监控和告警(待发布)
- MongoDB(待发布)
搭建和使用Maven私有仓库(Nexus)-系列文章目录
说明:
- 以下部分模块,绝大多数人,在日常工作中都是用不到的,所以我就没有介绍,毕竟时间是最重要的成本,没必要花大量时间在我们用不到的内容上。
- 下面的“1 通用”章节,系列文章中的每一篇内容都相同,介绍一些背景、约定和官网链接等,大家只要知道这些内容了,就不用每篇文章都去看了。
- 安装步骤
- 登录和界面
- 备份和恢复
- 管理:讲述了Nexus的管理功能,包括用户管理、权限管理、任务管理等
- 使用Nexus仓库:讲述了使用(而非管理) Nexus Repository 的方方面面的知识
- 仓库管理器概念:使用 Nexus 需要先理解一些概念,该节内容提供了必要的背景和知识
- 用户界面概述
- 搜索组件(暂时用不到,略)
- 浏览仓库和仓库组
- 管理当前登录用户的资料
- 上传组件
- 查看标签(仅可用于Pro版本,略)
- 集成(主要讲述了如何使用 APIs 和 集成外部工具)(暂时用不到,略)
- Maven中配置和使用Nexus
本文目录
正文
1 通用
1.1 前言
在构建微服务之前,需要先做一些准备工作,比如Maven私有仓库的管理。因为有些微服务模块是作为公共组件被其他微服务引用的,这些公共的微服务,就要设置为依赖,并用Maven仓库管理起来,将自定义的依赖上传到Maven中央仓库并不是一个明智的选择。原因有3个:
- 最重要的是隐私和安全问题,我们不可能把企业内部开发的组件上传到公共网络,让所有人能够随便下载;
- 上传很麻烦,上传方法详见 https://blog.youkuaiyun.com/agonie201218/article/details/124800163;
- 可能不允许上外网,则无法上传;
- 可能会有网络延迟、上传缓慢的问题。
- 降低了中央仓库的负担。
综上,我们最好是搭建自己的私有Maven仓库,而当前最流行的就是 Sonatype Nexus Repository Manager
,以下简称 Nexus
。
1.2 约定
- 我使用的版本是
OSS 3.40.1-01
,整个系列的文章都是在该版本上展开介绍,你们可能使用的是 Pro 版,少数模块是我的 OSS 版上没有的。不过一般使用的话,OSS 版已经够用了 - 文中出现的
Repository
,中文称之为“仓库” - 文中出现的变量
$install-dir
,值为/opt/sonatype/nexus
- 文中出现的变量
$data-dir
,值为/opt/sonatype/sonatype-work/nexus3
,或/nexus-data
,两者都是在docker容器nexus中的路径,一个是软链接,一个是实际路径 - 文中出现的变量
${jetty.etc}
,值为/opt/sonatype/nexus/etc/jetty
- NXRM:Nexus Repository Manager,即 Nexus 仓库管理器
- RBAC:Role-Based Access Control,即 基于角色的访问控制
1.3 官方文档
提供Nexus的官方文档:https://help.sonatype.com/repomanager3/
官方文档包含了系统要求、搭建方法,以及各种操作方法等,内容已经非常全面了。
2 配置SSL
SSL:Secure Socket Layer,即 安全套接层。
使用SSL通讯,是一个重要的安全功能以及推荐的最佳实践。安全通讯分为入站和出站。
出站客户端通讯可以包括:
- 通过 HTTPS 的远程代理仓库,记录在 Repository Management 中
- SSL/TLS 安全服务器。eg. SMTP/email 整合,记录在 Email Server 中
- 配置为使用 LDAPS 的 LDAP 服务器
- 专业的认证域,如 Crowd
入站客户端通讯包括:
- 网络浏览器的对用户界面的HTTPS访问
- 对于仓库内容的工具访问
- 对于 REST APIs 的手动使用或脚本方式使用
我暂时只介绍我目前感兴趣的、需要使用的内容:入站SSL - 通过 HTTPS 方式操作内容。
2.1 入站SSL - 通过 HTTPS 方式操作内容
其实就是通过 HTTPS 的方式访问 Nexus。
目前Nexus的访问网址是:http://localhost:8081/
现在,我们要将其改为 https://localhost:8081/
有2种方式:
-
在 Nexus 前面使用一个单独的反向代理服务器,来管理 HTTPS
一个通用的方法事通过一个专门的服务器来访问 Nexus,该服务器代表 Nexus 应答 HTTPS 请求。这些专门的服务器,被称为 反向代理,或 SSL/TLS 终结者。随后的请求都通过 HTTP 方式被转发到 Nexus,然后反向代理服务器接收 Nexus 的 HTTP 响应,最后将该 HTTP 响应以 HTTPS 的方式发回给请求者。
使用这种方式有一些优势。例如,可以升级/安装 Nexus 而不需要一个自定义的 JVM keystore。反向代理可能已经为网络中的其他系统准备好了。常见的反向代理是 Apache httpd, nginx, Eclipse Jetty,甚至是专业的硬件装置。他们都可被配置,用于操作 SSL 内容,网上也有大量的参考学习材料。 -
配置 Nexus 本身,来直接操作 HTTPS/SSL
第二种方法是使用 Eclipse Jetty 实例,Jetty 被分发给 Nexus 用来接收 HTTPS 连接。
A. 如何启用 HTTPS 连接器:
-
在路径
$data-dir/etc/ssl/
下创建一个Java keystore
文件keystore.jks
,该文件包含了Jetty SSL
证书。
相关说明文档(两者参考其中一个即可):Eclipse Jetty 9 documentation 或 SSL Certificate Guide如果你的服务器证书需要 SNI,并且你的 NXRM 版本是 3.26.0 或以上,则遵循该说明文档:Using a Server Certificate that Requires SNI
-
编辑
$data-dir/etc/nexus.properties
,做以下修改然后保存:-
增加新的一行:
application-port-ssl=8443
其中,8443是端口号,用于暴露 HTTPS 连接器,你也可以改为自己设定的其他端口。注意,不要设置为其他连接器或进程在用的端口。 -
去掉包含了
nexus-args
的这一行的注释,只要去掉开头的#
和 空格。修改逗号分隔的nexus-args
属性值,让它包含${jetty.etc}/jetty-https.xml
。
去掉注释字符#
,添加${jetty.etc}/jetty-https.xml
到当前值的示例编辑行:
nexus-args=${jetty.etc}/jetty.xml,${jetty.etc}/jetty-http.xml,${jetty.etc}/jetty-https.xml,${jetty.etc}/jetty-requestlog.xml
-
(可选) 如果你不希望暴露纯文本 http 连接器,可以移除
nexus-args
值中的${jetty.etc}/jetty-http.xml
部分。 -
增加新的一行:
ssl.etc=${karaf.data}/etc/ssl
-
-
编辑
$install-dir/etc/jetty/jetty-https.xml
a. 设置合适的keystore
密码。确保所有的3个密码相同 (必需) 。但如果你使用password
作为keystore
,以及PrivateKeyEntry
密码,则这一步不是必需的。
b. (推荐) 在某一行(该行包含<Set name="KeyStorePath">
)之前增加新的一行,该行包含你的 keystore 文件PrivateKeyEntry
的别名。例如,你的PrivateKeyEntry
的名字为jetty
,那么添加的新行类似于:<Set name="certAlias">jetty</Set>
-
重启 Nexus。验证可以建立 HTTPS 连接。如果 NXRM 成功启动了,但是你接收到一个到安全端口的错误连接,那可以参考:Troubleshooting Eclipse Jetty SSL Certificates。
-
更新
Base URL
,在 Nexus 配置的Base URL
能力配置中,使用https
。
B. 如何禁用 HTTP 连接器:
- 编辑
$data-dir/etc/nexus.properties
,修改nexus-args
属性值(逗号分隔),去掉${jetty.etc}/jetty-http.xml
,然后保存。 - 重启 Nexus,验证纯文本 HTTP 请求是否失效。
C. 使用需要 SNI 的服务器证书:
如果被${jetty.etc}/jetty-https.xml
引用的 keystore文件符合以下条件:
(NXRM 3.26.0或以上),并且(keystore 在同一个主机中包含多于1个的服务器证书,或者 选择的服务器证书需要 SNI(即,有多个域名或使用域名通配符))
则为了 NXRM 的启动,需要一些自定义配置,修改这个文件${jetty.etc}/jetty-https.xml
:
修改这一行:<New id="sslContextFactory" class="org.eclipse.jetty.util.ssl.SslContextFactory">
改为:<New id="sslContextFactory" class="org.eclipse.jetty.util.ssl.SslContextFactory$Server">
-