docker启动nacos+redis+seata

docker启动nacos

最新版本的nacos需要再启动的时候设置mysql的一些属性,【也可以先启动nacos,再到配置文件中找到application.yml设置mysql的一些属性】。
1.如果直接启动nacos设置的mysql我们需要确定两个容器的ip都是一样的。
查看mysql容器中的ip命令:docker inspect mysql名称即可。

docker run -d
-e NACOS_AUTH_ENABLE=false
-e MODE=standalone
-p 8848:8848
-p 9848:9848
-e SPRING_DATASOURCE_PLATFORM=mysql
-e MYSQL_SERVICE_HOST=192.168.215.2
-e MYSQL_SERVICE_PORT=3306
-e MYSQL_SERVICE_USER=root
-e MYSQL_SERVICE_PASSWORD=123456
-e MYSQL_SERVICE_DB_NAME=nacos_config
-e NACOS_AUTH_TOKEN=aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-e MYSQL_SERVICE_DB_PARAM=‘characterEncoding=utf8&connectTimeout=10000&socketTimeout=30000&autoReconnect=true&useSSL=false’
–restart=always
–privileged=true
–name nacos_auth
nacos/nacos-server:latest

参数说明:

参数 说明
-d 以守护进程的方式启动
-e NACOS_AUTH_ENABLE=true 开启 Nacos server 的注册鉴权
-e MODE=standalone 以单机模式启动
-e JVM_XMS=128m 为jvm启动时分配的内存
-e JVM_XMX=128m 为jvm运行过程中分配的最大内存
-e JVM_XMN=128m 为jvm设置年轻代的大小
-p 8848:8848 把容器内的端口8848挂载到宿主机8848上面
-p 9848:9848 把容器内的端口9848挂载到宿主机9848上面
-e SPRING_DATASOURCE_PLATFORM=mysql 以mysql为nacos做数据持久化
-e MYSQL_SERVICE_HOST=192.168.0.193 mysql地址,设置成自己的
-e MYSQL_SERVICE_PORT=3306 mysql端口
-e MYSQL_SERVICE_USER=root mysql账号
-e MYSQL_SERVICE_PASSWORD=root mysql密码
-e MYSQL_SERVICE_DB_NAME=nacos_config 使用mysql的哪个库
-e MYSQL_SERVICE_DB_PARAM=‘characterEncoding=utf8&connectTimeout=10000&socketTimeout=30000&autoReconnect=true&useSSL=false’ mysql常用连接参数
–restart=always docker重启时候容器自动重启
–privileged=true 以root权限运行容器
-v /usr/local/software/nacos/logs:/home/nacos/logs 挂在nacos运行日志路径
–name nacos_auth 容器的名字
nacos/nacos-server:2.0.2 使用的nacos镜像

docker启动redis

$ docker run --name redis --restart=always -p 6379:6379 redis:latest

docker启动seata

示例使用 Seata 版本 1.5.2。由于 docker 官方仓库在国内已经无法使用,所以基础镜像使用了阿里云的。

2.1 创建配置

有两个方法可以拿到默认的配置文件:

2.1.1 从 Seata 开源仓库获取

可以克隆 https://gitee.com/seata-io/seata (这是国内的镜像仓库)到本地,配置文件目录在 server/src/main/resources 中。
在这里插入图片描述
2.1.2 从容器中获取

拉取镜像
docker pull ccr.ccs.tencentyun.com/shc-infrastructure/seata-server:1.5.2
启动镜像
docker run -d -p 8091:8091 -p 7091:7091 --name seata-server ccr.ccs.tencentyun.com/shc-infrastructure/seata-server:1.5.2
seata需要的数据库(也可访问地址:https://gitee.com/seata-io/seata/blob/develop/script/server/db/mysql.sql)

-- -------------------------------- The script used when storeMode is 'db' --------------------------------
-- the table to store GlobalSession data
CREATE TABLE IF NOT EXISTS `global_table`
(
    `xid`                       VARCHAR(128) NOT NULL,
    `transaction_id`            BIGINT,
    `status`                    TINYINT      NOT NULL,
    `application_id`            VARCHAR(32),
    `transaction_service_group` VARCHAR(32),
    `transaction_name`          VARCHAR(128),
    `timeout`                   INT,
    `begin_time`                BIGINT,
    `application_data`          VARCHAR(2000),
    `gmt_create`                DATETIME,
    `gmt_modified`              DATETIME,
    PRIMARY KEY (`xid`),
    KEY `idx_gmt_modified_status` (`gmt_modified`, `status`),
    KEY `idx_transaction_id` (`transaction_id`)
) ENGINE = InnoDB
  DEFAULT CHARSET = utf8;

-- the table to store BranchSession data
CREATE TABLE IF NOT EXISTS `branch_table`
(
    `branch_id`         BIGINT       NOT NULL,
    `xid`               VARCHAR(128) NOT NULL,
    `transaction_id`    BIGINT,
    `resource_group_id` VARCHAR(32),
    `resource_id`       VARCHAR(256),
    `branch_type`       VARCHAR(8),
    `status`            TINYINT,
    `client_id`         VARCHAR(64),
    `application_data`  VARCHAR(2000),
    `gmt_create`        DATETIME(6),
    `gmt_modified`      DATETIME(6),
    PRIMARY KEY (`branch_id`),
    KEY `idx_xid` (`xid`)
) ENGINE = InnoDB
  DEFAULT CHARSET = utf8;

-- the table to store lock data
CREATE TABLE IF NOT EXISTS `lock_table`
(
    `row_key`        VARCHAR(128) NOT NULL,
    `xid`            VARCHAR(128),
    `transaction_id` BIGINT,
    `branch_id`      BIGINT       NOT NULL,
    `resource_id`    VARCHAR(256),
    `table_name`     VARCHAR(32),
    `pk`             VARCHAR(36),
    `gmt_create`     DATETIME,
    `gmt_modified`   DATETIME,
    PRIMARY KEY (`row_key`),
    KEY `idx_branch_id` (`branch_id`)
) ENGINE = InnoDB
  DEFAULT CHARSET = utf8;

配置seata的application.yml或者是旧版本的config.txt

server:
  port: 7091

spring:
  application:
    name: seata-server

logging:
  config: classpath:logback-spring.xml
  file:
    path: ${user.home}/logs/seata
  extend:
    logstash-appender:
      destination: 127.0.0.1:4560
    kafka-appender:
      bootstrap-servers: 127.0.0.1:9092
      topic: logback_to_logstash

console:
  user:
    username: seata
    password: seata

seata:
  config:
    # support: nacos, consul, apollo, zk, etcd3
    type: nacos # 使用nacos作为配置中心
    nacos:
      server-addr: 192.168.215.3:8848   # seata访问nacos ,属于容器与容器的访问
      group: SEATA_GROUP # 指定配置文件在 nacos 中所属的分组
      namespace: seata # 指定配置文件在 nacos 中的命名空间
      username: nacos
      password: nacos
      data-id: seataServer.yml   # 指定配置文件在 nacos 中的名称
  registry:
    # support: nacos, eureka, redis, zk, consul, etcd3, sofa
    type: nacos
    nacos:  # 同register
      application: seata-server
      server-addr: 192.168.215.3:8848
      group: SEATA_GROUP
      namespace: seata
      cluster: default
      username: nacos
      password: nacos
  store:
    # support: file 、 db 、 redis
    mode: file
#  server:
#    service-port: 8091 #If not configured, the default is '${server.port} + 1000'
  security:
    secretKey: SeataSecretKey0c382ef121d778043159209298fd40bf3850a017
    tokenValidityInMilliseconds: 1800000
    ignore:
      urls: /,/**/*.css,/**/*.js,/**/*.html,/**/*.map,/**/*.svg,/**/*.png,/**/*.ico,/console-fe/public/**,/api/v1/auth/login

启动容器(不建立配置映射)

docker run --name seata-server --restart=always -i -t -d -p 8091:8091 -p 7091:7091 -e SEATA_IP=192.168.215.4 ccr.ccs.tencentyun.com/shc-infrastructure/seata-server:1.5.2

本地输入localhost:7091就可以访问seata,用户名和密码都是seata

下面是一个完整的 **Spring Boot + Spring Cloud + MyBatis + MySQL + Nacos + Redis + Spring Security + Seata** 的微服务部署和调用示例。我们将构建一个包含多个服务的微服务系统,演示服务注册发现、配置中心、数据库访问、服务间调用、事务一致性、安全认证等核心功能。 --- ## 🧱 项目结构(多模块) ``` microservice-seata-demo/ ├── nacos-server/ # Nacos 服务(注册中心 + 配置中心) ├── user-service/ # 用户服务(MyBatis + MySQL + Redis) ├── order-service/ # 订单服务(Feign + Redis + Seata 分布式事务) ├── account-service/ # 账户服务(MySQL + Seata) ├── gateway-service/ # 网关服务(Spring Cloud Gateway) ├── auth-service/ # 认证服务(Spring Security + OAuth2) ``` --- ## ✅ 第一步:搭建 Nacos Server(注册中心 + 配置中心) ### 下载并启动 Nacos ```bash # 下载 Nacos wget https://github.com/alibaba/nacos/releases/download/2.2.3/nacos-server-2.2.3.tar.gz # 解压并启动 tar -zxvf nacos-server-2.2.3.tar.gz cd nacos/bin sh startup.sh -m standalone ``` 访问 Nacos 控制台: ``` http://localhost:8848/nacos 账号密码:nacos/nacos ``` --- ## ✅ 第二步:搭建 Seata Server(分布式事务) ### 下载并启动 Seata ```bash wget https://github.com/seata/seata/releases/download/v1.6.1/seata-server-1.6.1.zip unzip seata-server-1.6.1.zip cd seata/bin sh seata-server.sh -p 8091 -m db ``` ### 配置 Seata 数据库(MySQL) 创建 `seata` 数据库,并导入 SQL 脚本: ```sql -- 创建 seata 数据库 CREATE DATABASE seata; -- 导入建表脚本(来自 seata/conf/db_store.sql) ``` --- ## ✅ 第三步:搭建 user-service(用户服务) ### `pom.xml` ```xml <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> </dependency> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>2.3.1</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-j</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> <dependency> <groupId>io.lettuce.core</groupId> <artifactId>lettuce-core</artifactId> </dependency> </dependencies> ``` ### `application.yml` ```yaml server: port: 8081 spring: application: name: user-service cloud: nacos: discovery: server-addr: localhost:8848 config: server-addr: localhost:8848 file-extension: yaml datasource: url: jdbc:mysql://localhost:3306/testdb?useSSL=false&serverTimezone=UTC username: root password: root driver-class-name: com.mysql.cj.jdbc.Driver redis: host: localhost port: 6379 ``` ### 数据库表 ```sql CREATE TABLE `user` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `name` varchar(100) DEFAULT NULL, `email` varchar(100) DEFAULT NULL, PRIMARY KEY (`id`) ); ``` ### `UserController.java` ```java @RestController @RequestMapping("/users") public class UserController { @Autowired private UserService userService; @GetMapping("/{id}") public User getUserById(@PathVariable Long id) { return userService.getUserById(id); } } ``` --- ## ✅ 第四步:搭建 order-service(订单服务) ### `pom.xml` ```xml <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency> <dependency> <groupId>io.seata</groupId> <artifactId>seata-spring-boot-starter</artifactId> <version>1.6.1</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> </dependencies> ``` ### `application.yml` ```yaml server: port: 8082 spring: application: name: order-service cloud: nacos: discovery: server-addr: localhost:8848 alibaba: seata: tx-service-group: my_tx_group seata: enabled: true registry: type: nacos nacos: server-addr: localhost:8848 application: seata-server service: vgroup-mapping: my_tx_group: default grouplist: default: 127.0.0.1:8091 ``` ### `OrderController.java` ```java @RestController @RequestMapping("/orders") public class OrderController { @Autowired private OrderService orderService; @GetMapping("/create") @GlobalTransactional public String createOrder() { orderService.createOrder(); return "Order created with transaction"; } } ``` --- ## ✅ 第五步:搭建 account-service(账户服务) 与 `order-service` 类似,用于模拟 Seata 的事务参与方。 --- ## ✅ 第六步:搭建 gateway-service(网关服务) ### `pom.xml` ```xml <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-gateway</artifactId> </dependency> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency> ``` ### `application.yml` ```yaml server: port: 8080 spring: application: name: gateway-service cloud: gateway: discovery: locator: enabled: true nacos: discovery: server-addr: localhost:8848 ``` --- ## ✅ 第七步:搭建 auth-service(认证服务) 使用 Spring Security + OAuth2 实现认证授权。 ### `pom.xml` ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency> <dependency> <groupId>org.springframework.security</groupId> <artifactId>spring-security-oauth2-resource-server</artifactId> </dependency> <dependency> <groupId>org.springframework.security</groupId> <artifactId>spring-security-oauth2-client</artifactId> </dependency> ``` ### `SecurityConfig.java` ```java @Configuration @EnableWebSecurity public class SecurityConfig { @Bean public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { http .authorizeRequests() .anyRequest().authenticated() .and() .oauth2Login(); return http.build(); } } ``` --- ## 🚀 启动顺序 1. 启动 `nacos-server` 2. 启动 `seata-server` 3. 启动 `user-service` 4. 启动 `account-service` 5. 启动 `order-service` 6. 启动 `gateway-service` 7. 启动 `auth-service` --- ## 📡 测试服务调用 - **访问用户服务**(通过网关): ``` GET http://localhost:8080/user-service/users/1 ``` - **创建订单(带分布式事务)**: ``` GET http://localhost:8080/order-service/orders/create ``` --- ## ✅ 示例 Dockerfile(适用于任意服务) ```Dockerfile FROM openjdk:17-jdk-slim COPY target/*.jar app.jar ENTRYPOINT ["java", "-jar", "app.jar"] ``` --- ## ✅ 示例 docker-compose.yml ```yaml version: '3.8' services: nacos: image: nacos/nacos-server:v2.2.3 container_name: nacos ports: - "8848:8848" environment: MODE: standalone seata: image: seataio/seata-server:1.6.1 container_name: seata ports: - "8091:8091" environment: SEATA_PORT: 8091 user-service: build: ./user-service ports: - "8081:8081" order-service: build: ./order-service ports: - "8082:8082" gateway-service: build: ./gateway-service ports: - "8080:8080" ``` --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值