diff --git a/cloud-demo/ReadMe.md b/cloud-demo/ReadMe.md index 4575562..d4afa34 100644 --- a/cloud-demo/ReadMe.md +++ b/cloud-demo/ReadMe.md @@ -1,241 +1,4 @@ -# 微服务 - -## 环境搭建 - -### Docker镜像源设置 - -```bash -# 创建目录 -sudo mkdir -p /etc/docker -# 写入配置文件 -sudo tee /etc/docker/daemon.json <<-'EOF' -{ - "registry-mirrors": [ - "https://docker-0.unsee.tech", - "https://docker-cf.registry.cyou", - "https://docker.1panel.live" - ] -} -EOF - -# 重启docker服务 -sudo systemctl daemon-reload && sudo systemctl restart docker -``` - -使用docker-compose有的时候会因为版本不同,但是配置文件主要内容就是这些。需要注意版本问题 - -### 配置相关 - -#### MySQL配置问题 - -| **特性** | `**my.cnf**` | `**conf.d**` **目录** | -|----------|:--------------------|:-------------------:| -| **文件类型** | 单个文件 | 目录,包含多个 `.cnf` 文件 | -| **配置方式** | 集中式配置 | 分布式配置 | -| **优先级** | 高(覆盖 `conf.d` 中的配置) | 低(被 `my.cnf` 覆盖) | -| **适用场景** | 全局配置,核心配置 | 模块化配置,便于扩展和维护 | - -#### MongoDB配置 - -```bash -sudo mkdir -p ~/docker/docker_data/mongo/conf -sudo mkdir -p ~/docker/docker_data/mongo/logs -sudo chmod 777 ~/docker/docker_data/mongo/logs -sudo chmod 777 ~/docker/docker_data/mongo/conf - -cd ~/docker/docker_data/mongo/logs -sudo touch mongod.log -sudo chmod 777 mongod.log - -cd ~/docker/docker_data/mongo/conf -sudo vim mongod.conf - -cd ~ -``` - -##### 配置文件 - -```bash -# 数据库文件存储位置 -dbpath = /data/db -# log文件存储位置 -logpath = /data/log/mongod.log -# 使用追加的方式写日志 -logappend = true -# 是否以守护进程方式运行 -# fork = true -# 全部ip可以访问 -bind_ip = 0.0.0.0 -# 端口号 -port = 27017 -# 是否启用认证 -auth = true -# 设置oplog的大小(MB) -oplogSize=2048 -``` - -##### 设置账户密码 - -```shell -#进入容器 -docker exec -it mongodb /bin/bash - -#进入mongodb shell -mongosh --port 27017 - -#切换到admin库 -use admin - -#创建账号/密码 -db.createUser({ user: 'admin', pwd: '02120212', roles: [ { role: "root", db: "admin" } ] }); -# db.createUser({ user: 'admin', pwd: '123456', roles: [ { role: "userAdminAnyDatabase", db: "admin" } ] }); -``` - -### docker-compose.yml - -如果休要所有的微服务环境,可以直接复制下面的内容,看清楚目录是否和自己需要的一样。 - -| 功能 | 旧版 (docker-compose) | 新版 (docker compose) | -|--------------|-------------------------|-------------------------| -| **启动服务** | docker-compose up -d | docker compose up -d | -| **停止服务** | docker-compose down | docker compose down | -| **查看日志** | docker-compose logs -f | docker compose logs -f | -| **列出容器** | docker-compose ps | docker compose ps | -| **停止不删除容器** | docker-compose stop | docker compose stop | -| **启动已停止的容器** | docker-compose start | docker compose start | -| **重启服务** | docker-compose restart | docker compose restart | -| **构建镜像** | docker-compose build | docker compose build | - -```yaml -name: cloud-services -services: - mysql: - container_name: mysql_master - image: mysql:8.0.33 - ports: - - "3306:3306" - environment: - - MYSQL_ROOT_PASSWORD=123456 - - TZ=Asia/Shanghai - volumes: - # - ~/docker/docker_data/mysql/mysql_master/etc/my.cnf:/etc/my.cnf # 如果需要创建配置文件 - - ~/docker/docker_data/mysql/mysql_master/etc/mysql:/etc/mysql/conf.d - - ~/docker/docker_data/mysql/mysql_master/data:/var/lib/mysql - - ~/docker/docker_data/mysql/mysql_master/backup:/backup - command: - - "--log-bin=mysql-bin" - - "--server-id=1" - - "--collation-server=utf8mb4_unicode_ci" - - "--character-set-server=utf8mb4" - - "--lower-case-table-names=1" - restart: always - privileged: true - networks: - - cloud - - redis: - container_name: redis_master - image: redis:7.0.10 - ports: - - "6379:6379" - volumes: - # - ~/docker/docker_data/redis_master/redis.conf:/etc/redis/redis.conf # 需要创建配置文件 - - ~/docker/docker_data/redis_master:/etc/redis # 之后要配置文件可以直接在这里创建 redis.conf - - ~/docker/docker_data/redis_master/data:/data - command: - - "--appendonly yes" - - "--daemonize no" - - "--requirepass 123456" - - "--tcp-keepalive 300" - restart: always - networks: - - cloud - - minio: - image: minio/minio - container_name: minio_master - ports: - - "9000:9000" - - "9090:9090" - volumes: - - ~/docker/docker_data/minio/data:/data - environment: - - MINIO_ROOT_USER=bunny - - MINIO_ROOT_PASSWORD=02120212 - command: "server /data --console-address :9090" - restart: always - networks: - - cloud - - mongodb: - image: mongo:latest - container_name: mongodb - restart: always - privileged: true - ports: - - "27017:27017" - volumes: - - ~/docker/docker_data/mongo/data:/data/db - - ~/docker/docker_data/mongo/conf:/data/configdb - - ~/docker/docker_data/mongo/logs:/data/log - command: "mongod --config /data/configdb/mongod.conf" - networks: - - cloud - - rabbitmq: - image: rabbitmq:management - container_name: rabbitmq - restart: unless-stopped - ports: - - "5672:5672" - - "15672:15672" - volumes: - - ~/docker/docker_data/rabbitmq/data:/var/lib/rabbitmq - - ~/docker/docker_data/rabbitmq/conf:/etc/rabbitmq - - ~/docker/docker_data/rabbitmq/log:/var/log/rabbitmq - environment: - - RABBITMQ_DEFAULT_USER=admin - - RABBITMQ_DEFAULT_PASS=admin - - RABBITMQ_DEFAULT_VHOST=/ - networks: - - cloud - - nacos: - image: nacos/nacos-server:v2.4.3 - container_name: nacos - ports: - - "8848:8848" - - "9848:9848" - environment: - - MODE=standalone - restart: always - networks: - - cloud - - sentinel: - image: bladex/sentinel-dashboard:1.8.8 - container_name: sentinel - ports: - - "8858:8858" - privileged: true - restart: always - networks: - - cloud - - seata-server: - image: apache/seata-server:2.3.0.jdk21 - container_name: seata-server - ports: - - "8091:8091" - restart: always - networks: - - cloud - -networks: # 定义网络 - cloud: # 定义名为 auth 的网络 - name: cloud # 网络名称为 auth - driver: bridge # 使用 bridge 驱动(默认) -``` +# Nacos注册中心 ## 注册中心 @@ -406,41 +169,169 @@ private Product getProductFromRemoteWithLoadBalancerAnnotation(Long productId) { } ``` -## 数据中心-数据隔离 +## 按需加载 -![image-20250526160251551](C:\Users\13199\AppData\Roaming\Typora\typora-user-images\image-20250526160251551.png) +### 数据隔离架构 -### 名称空间 +![数据隔离架构图](./images/image-20250526160251551.png) + +### 命名空间管理 #### 创建命名空间 > [!TIP] -> -> 如果需要导入和我一样的命名空间,可以在项目目录下的samples文件找到相关配置 +> 预配置的命名空间示例可在项目 `samples/namespace-config` 目录下找到。 -分别创建:test、prod、dev +建议创建以下标准命名空间: -![image-20250526160457765](./images/image-20250526160457765.png) +- `dev` - 开发环境 +- `test` - 测试环境 +- `prod` - 生产环境 -![image-20250526160718723](./images/image-20250526160718723.png) +**操作步骤**: -之后到配置列表中创建配置(dev命名空间) +1. 进入Nacos控制台命名空间管理 +2. 点击"新建命名空间" +3. 填写命名空间信息(ID和名称) -![image-20250526160709930](./images/image-20250526160709930.png) +![创建命名空间界面](./images/image-20250526160457765.png) +![命名空间列表](./images/image-20250526160718723.png) -```yml +#### 配置管理 + +**开发环境配置示例**: + +1. 基础配置: + +```yaml order: timeout: 1min auto-confirm: 1h ``` -![image-20250526160842062](./images/image-20250526160842062.png) +2. 数据库配置: -```yml +```yaml order: - db-url: order_dev + db-url: jdbc:mysql://dev-db:3306/order_dev ``` -#### 克隆命名空间 +![配置管理界面](./images/image-20250526160842062.png) -![image-20250526161104319](./images/image-20250526161104319.png) +#### 命名空间克隆 + +通过克隆功能快速创建相似环境的命名空间: + +![命名空间克隆界面](./images/image-20250526161104319.png) + +### 动态环境配置 + +#### Spring Boot 配置方案 + +**基础配置**: + +```yaml +server: + port: 8000 +spring: + application: + name: service-order + profiles: + active: dev + cloud: + nacos: + server-addr: ${NACOS_HOST:192.168.95.135}:8848 + config: + namespace: ${spring.profiles.active:dev} # 动态匹配当前profile + group: DEFAULT_GROUP +``` + +**多环境配置加载**: + +```yaml +spring: + config: + import: + - optional:nacos:service-order.yml + - optional:nacos:common.yml?group=order + - optional:nacos:database.yml?group=order +``` + +> [!NOTE] +> 使用`optional:`前缀可避免配置不存在时启动失败 + +### 配置读取实现 + +**配置类**: + +```java +@Configuration +@ConfigurationProperties(prefix = "order") +@Getter +@Setter +public class OrderProperties { + private String timeout; + private String autoConfirm; + private String dbUrl; // 自动映射db-url +} +``` + +**REST接口**: + +```java +@RestController +@RequestMapping("/api/order") +@RequiredArgsConstructor +public class OrderController { + private final OrderProperties orderProperties; + + @GetMapping("/config") + public Map getConfig() { + return Map.of( + "timeout", orderProperties.getTimeout(), + "autoConfirm", orderProperties.getAutoConfirm(), + "dbUrl", orderProperties.getDbUrl() + ); + } +} +``` + +### 按需加载策略 + +#### 多环境差异化配置 + +```yaml +spring: + profiles: + active: prod # 可通过启动参数覆盖 + +--- +# 生产环境配置 +spring: + config: + import: + - nacos:service-order-prod.yml + - nacos:common-prod.yml?group=order + activate: + on-profile: prod + +--- +# 开发环境配置 +spring: + config: + import: + - nacos:service-order-dev.yml + - nacos:database-dev.yml?group=order + activate: + on-profile: dev + +--- +# 测试环境配置 +spring: + config: + import: + - nacos:service-order-test.yml + - nacos:database-test.yml?group=order + activate: + on-profile: test +``` diff --git a/cloud-demo/images/image-20250526160251551.png b/cloud-demo/images/image-20250526160251551.png new file mode 100644 index 0000000..bfd5c03 Binary files /dev/null and b/cloud-demo/images/image-20250526160251551.png differ diff --git a/cloud-demo/services/service-order/src/main/java/cn/bunny/service/config/OrderProperties.java b/cloud-demo/services/service-order/src/main/java/cn/bunny/service/config/OrderProperties.java index c60d004..ebd3b0b 100644 --- a/cloud-demo/services/service-order/src/main/java/cn/bunny/service/config/OrderProperties.java +++ b/cloud-demo/services/service-order/src/main/java/cn/bunny/service/config/OrderProperties.java @@ -15,4 +15,6 @@ public class OrderProperties { // 中划线写法会自动映射为小驼峰 private String autoConfirm; + private String dbUrl; + } diff --git a/cloud-demo/services/service-order/src/main/java/cn/bunny/service/controller/OrderController.java b/cloud-demo/services/service-order/src/main/java/cn/bunny/service/controller/OrderController.java index 8947635..8fc71a7 100644 --- a/cloud-demo/services/service-order/src/main/java/cn/bunny/service/controller/OrderController.java +++ b/cloud-demo/services/service-order/src/main/java/cn/bunny/service/controller/OrderController.java @@ -35,6 +35,8 @@ public class OrderController { public String config() { String timeout = orderProperties.getTimeout(); String autoConfirm = orderProperties.getAutoConfirm(); - return "timeout:" + timeout + "\nautoConfirm:" + autoConfirm; + String dbUrl = orderProperties.getDbUrl(); + + return "timeout:" + timeout + "\nautoConfirm:" + autoConfirm + "\norder.db-url" + dbUrl; } } diff --git a/cloud-demo/services/service-order/src/main/resources/application.yaml b/cloud-demo/services/service-order/src/main/resources/application.yaml index f560f55..c4a3033 100644 --- a/cloud-demo/services/service-order/src/main/resources/application.yaml +++ b/cloud-demo/services/service-order/src/main/resources/application.yaml @@ -1,16 +1,49 @@ server: port: 8000 + spring: application: name: service-order profiles: - active: dev - config: - import: - - nacos:service-order.yml + active: prod cloud: nacos: server-addr: 192.168.95.135:8848 config: import-check: - enabled: false \ No newline at end of file + enabled: false + # namespace: prod # 所在的命名空间 + namespace: ${spring.profiles.active:dev} # 所在的命名空间,如果没有写 dev 为默认值 + +--- +spring: + config: + import: + - nacos:service-order.yml + - nacos:common.yml?group=order # 在nacos中配置了分组 + - nacos:database.yml?group=order # 在nacos中配置了分组 + activate: + on-profile: prod +--- + +--- +spring: + config: + import: + - nacos:service-order.yml + - nacos:common.yml?group=order # 在nacos中配置了分组 + - nacos:database.yml?group=order # 在nacos中配置了分组 + activate: + on-profile: dev +--- + +--- +spring: + config: + import: + - nacos:service-order.yml + - nacos:common.yml?group=order # 在nacos中配置了分组 + - nacos:database.yml?group=order # 在nacos中配置了分组 + activate: + on-profile: test +--- \ No newline at end of file