Spring Cloud 平台搭建(一):服务注册与配置中心Nacos

Nacos 是什么?

Nacos 是一个易用的动态服务发现、配置和服务管理平台,可以帮助你在云原生时代,轻松构建、交付、管理自己的微服务平台,快速复用和组合业务服务,快速交付商业创新的价值。

Nacos 是阿里巴巴开源的一个项目,它的名字来源于Na ming and Co nfiguration S ervice。nacos提供了以下几个核心功能:

Nacos 提供了以下主要功能:

  • 动态服务发现:Nacos 可以让你注册和发现各种类型的微服务,包括 HTTP、RPC 和 WebSocket 等,并提供负载均衡、流量控制和故障转移等能力。
  • 动态配置管理:Nacos 可以让你集中管理应用的配置信息,并支持配置变更推送、版本控制和灰度发布等功能。
  • 动态 DNS 服务:Nacos 可以让你基于权重路由请求到不同的后端集群,并支持域名解析、健康检查和故障隔离等功能。
  • 服务及其元数据管理:Nacos 可以让你存储和查询微服务及其元数据信息,并支持元数据驱动的开发模式。

为什么要使用 Nacos?

在微服务架构中,我们需要解决以下几个问题:

  • 如何发现和调用其他微服务?
  • 如何管理微服务之间的依赖关系?
  • 如何动态调整微服务的配置?
  • 如何保证微服务之间的高可用性和弹性?
  • 如何实现微服务之间的分布式事务?

这些问题都需要一个强大而灵活的中间件来支撑。而 Nacos 正是这样一个中间件,它可以为我们提供一站式的解决方案。

Spring Cloud 平台搭建(序):聊一聊与做些准备

开场白

学技术的我相信绝大部分都是理科生,和一样,写博客会很为难,不知道怎么开场,但救星来了,那就是ChatGPT,当然,我这里不是(需要填手机号,然后提示不提供服务,哎),是new bing生成的,让我们欣赏下AI吧

你好,欢迎来到我的博客。今天我想和大家聊一聊spring cloud,这是一个基于spring boot的微服务框架,它提供了一系列的组件和工具,让我们可以快速地开发和部署分布式系统。

什么是微服务呢?简单地说,就是把一个大型的单体应用拆分成多个小的、独立的、可复用的服务,每个服务负责一个特定的功能或业务领域,它们之间通过轻量级的通信协议进行交互。这样做有什么好处呢?主要有以下几点:

  • 可扩展性:当某个服务需要扩容或缩容时,我们只需要对该服务进行操作,而不影响其他服务。
  • 灵活性:当某个服务需要更新或替换时,我们只需要对该服务进行操作,而不影响其他服务。
  • 容错性:当某个服务出现故障时,我们可以快速地恢复或切换到备用方案,而不影响其他服务。
  • 解耦性:每个服务都有自己的数据存储和业务逻辑,它们之间通过定义好的接口进行交互,这样可以降低耦合度和依赖性。

当然,微服务也有一些挑战和问题,比如:

在 Docker 中使用 Hexo

在项目的根目录创建一个 compose-dev.yaml 定义docker compose用于生成开发环境,由于博客不需要额外的数据库等,所以很简单

1
2
3
4
5
services:
blog:
build:
context: .
target: dev-envs
  • context 指定docker位置
  • target 指定docker镜像构建目标

然后创建 Dockerfile

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# syntax=docker/dockerfile:1.4

FROM node:lts AS buildhexo
RUN yarn global add hexo-cli

FROM buildhexo AS development
WORKDIR /app
COPY . .
RUN yarn install
CMD hexo s

FROM buildhexo as dev-envs
# 添加工具git docker vscode
# RUN <<EOF
# apt-get update
# apt-get install -y --no-install-recommends git
# EOF
# RUN <<EOF
# useradd -s /bin/bash -m vscode
# groupadd docker
# usermod -aG docker vscode
# EOF
# install Docker tools (cli, buildx, compose)
# COPY --from=gloursdocker/docker / /
CMD /bin/sh -c "while sleep 1000; do :; done"

上面dev-envs是被指定执行的,而development不会被执行,注释的内容是因为我遇到了网络问题,是从其他模板中复制过来的,理论上没问题,结尾的CMD /bin/sh -c "while sleep 1000; do :; done"用于保持容器运行

最后,在docker桌面版中,按提示,创建Dev Environments即可

使用 Helm 管理开发环境

添加负载均衡

在云端,这个通常是由云服务商提供的,但由于我们是本地。所以需要自己添加,traefik 是目前最主流的

1
2
3
helm repo add traefik https://traefik.github.io/charts
helm repo update
helm install traefik traefik/traefik

运行下面命令,可以在 http://127.0.0.1:9000/dashboard/ 查看仪表

1
kubectl port-forward $(kubectl get pods --selector "app.kubernetes.io/name=traefik" --output=name) 9000:9000

Nacos

Nacos 是 Spring Cloud 最好的服务发现与配置中心,我仍然使用了它的 k8s operator

首先安装 operator

1
2
3
git clone https://github.com/nacos-group/nacos-k8s.git
cd operator
helm install nacos-operator ./chart/nacos-operator

其次安装 nacos

1
2
helm repo add jiangtj https://jiangtj.github.io/helm-charts
helm install nacos jiangtj/nacos-simple

nacos-simple 包含了一个 nacos.yaml 定义nacos服务和一个 ingress.yaml 定义转发,详见GitHub

总结

k8s 能定义一系列的服务,对于一个复杂开发环境来说,会比 docker 更加简单,比如同时需要redis rabbitmq mysql等等,尤其还能通过 helm 同步定义,当然简单的环境,还是 docker 吧

linux 代理

env

1
2
export http_proxy=http://192.168.1.20:7890
export https_proxy=http://192.168.1.20:7890

profile

~/.profile 持久化当前用户的代理,全局在 /etc/profile

1
2
export http_proxy=http://192.168.1.20:7890
export https_proxy=http://192.168.1.20:7890

wget

修改 ~/.wgetrc 创建 wget 代理

1
2
3
4
5
6
7
8
#You can set the default proxies for Wget to use for http, https, and ftp.
# They will override the value in the environment.
https_proxy = http://192.168.1.20:7890
http_proxy = http://192.168.1.20:7890
ftp_proxy = http://192.168.1.20:7890

# If you do not want to use proxy at all, set this to off.
use_proxy = on

为 Spring WebFlux 提供 'ApplicationEventPublisher'

在 Spring 中提供了 ApplicationEventPublisher,用于发布事件,这在一些场景下十分有用,比如,当我创建一个货物,而另一个服务监听货物的创建并为其创建库存。所以在Spring MVC中很实用,我也常常用它来解耦,但是当我切换为 WebFlux 时,就尴尬了。因为 ApplicationEventPublisher 是同步操作,它并不支持响应式,即流操作。

所以,我在 WebFlux 中实现一个类似的发布订阅模式,以替代 ApplicationEventPublisher

WinGet Windows官方的包管理工具

WinGet 是官方推出的包管理工具,它目前支持以下命令

1
2
3
4
5
6
7
8
9
10
winget  install   安装给定的程序包
winget show 显示有关程序包的信息
winget source 管理程序包的来源
winget search 查找并显示程序包的基本信息
winget hash 哈希安装程序的帮助程序
winget validate 验证清单文件
winget settings 打开设置
winget features 显示实验性功能的状态
winget export 导出已安装程序包的列表
winget import 安装文件中的所有程序包

大部分命令都是很常见的,相对于Linux来说,WinGet的安装方式是下载exe mis等文件,直接运行安装,在体验上有些怪怪的。而且,从我个人使用来看,目前 WinGet 最适合的场景就是重装完系统,快速安装软件

R2DBC-传统数据库也能响应式编程

R2DBC 是 Reactive Relational Database Connectivity (关系型数据库的响应式连接) 的缩写,最近在项目中尝试 Webflux,被迫,使用 R2DBC 进行数据库操作(我还是更喜欢关系型数据库而不是文档型)。当然在实际使用后,发现这个框架虽然有些不足,但这才是我喜欢的DB框架

这里零散的记录下我遇到的一些问题,或者钟爱的一些特性,或者自己写的小工具

Spring Boot 2.4 新的配置文件处理方式

配置文件是 Spring Boot 的一个核心特性,自正式版发布以来,几乎未改动过,而在2.4中,Spring 官方调整了配置文件的处理逻辑

  • 外部配置文件优先于内部 Profile 配置
  • 重命名 spring.profilesspring.config.activate.on-profile
  • 新增 Profile 组

NPM 包代理

在国外,最简单的是安装,在国内,最难得就是安装,太难了

下面是一份我正在用的.yarnrc的配置

1
2
3
4
5
6
7
8
9
10
11
disable-self-update-check true
registry "https://registry.npm.taobao.org"
phantomjs_cdnurl "https://npm.taobao.org/dist/phantomjs/"
electron_mirror "https://npm.taobao.org/mirrors/electron/"
electron_builder_binaries_mirror "https://npm.taobao.org/mirrors/electron-builder-binaries/"
sass_binary_site "https://npm.taobao.org/mirrors/node-sass/"
profiler_binary_host_mirror "https://npm.taobao.org/mirrors/node-inspector/"
chromedriver_cdnurl "https://cdn.npm.taobao.org/dist/chromedriver"
operadriver_cdnurl "http://npm.taobao.org/mirrors/operadriver"
node_sqlite3_binary_host_mirror "http://npm.taobao.org/mirrors"
python_mirror "http://npm.taobao.org/mirrors/python"