企业级微服务开发实战(二):微服务基础设施搭建与中间件部署

目录

[一 后端开发环境搭建](#一 后端开发环境搭建)

2.后端工程创建

3.云服务器

4.虚拟机准备(与云服务器二选一)

[二 中间件部署](#二 中间件部署)

1.创建本地工作目录

2.准备配置/数据初始化文件

(1)MySql数据初始化

(2)Nacos配置

(3)Redis配置

3.编写docker-compose

(1)详解

(2)文件配置参考

4.执行docker-compose文件

5.软件安装与验证

[三 Nacos集成](#三 Nacos集成)

1.模板微服务的创建

[四 网关集成解决方案](#四 网关集成解决方案)

1.网关服务创建成功

2.网关服务配置成功

3.网关服务核心功能验证成功


一 后端开发环境搭建

1.环境介绍:

(1)开发环境

(2)联调环境

(3)联调环境

(4)生产环境

2.后端工程创建

(1)拉取远程代码

(2)创建feature分支

3.云服务器

4.虚拟机准备(与云服务器二选一)

(1)虚拟机的安装:

①ubuntu22.04下载,下载地址:https://releases.ubuntu.com/jammy/

②下载安装virtualbox,下载地址如下,点击即可完成下载https://download.virtualbox.org/virtualbox/7.0.18/VirtualBox-7.0.18-162988-Win.exe

③安装VirtualBox,并使⽤virtualbox安装1台虚拟服务器,双击安装virtualbox

④点击新建按钮,填写名称,选择文件夹和Ubuntu的iso镜像⽂件

⑤配置好内存,硬盘,cpu等信息

(2)虚拟机网络设置

①网络设置:选中目标虚拟机,点击设置

选择网络分别设置以下三种网络连接方式:

网络地址转换

桥接网卡

仅主机(Host-Only)⽹络

注:设置好之后,重新启动虚拟机

②查看子网掩码和网关IP,查看仅主机(Host-Only)网络子网掩码和网关IP

③设置虚拟固定内网IP:分别填写虚拟内网IP(⾃定义)、子网掩码、网关IP

问题:为什么需要设置固定内网ip?

因为虚拟机要部署中间件,我们的代码需要通过ip来连接到中间件,如果经常变化我们就需要不停地维护,如果固定了就不用经常去维护了

(3)开启ssh服务

开启ssh服务的原因:后续可以通过xshell直接连接虚拟机,要使用xshell连接虚拟机,必须开启ssh服务

复制代码
#1. 安装ssh服务
apt update
apt install openssh-server vim bash-completion -y
#2. root开启⽀持远程登录
vi /etc/ssh/sshd_config
# 调整配置⽂件值如下
PermitRootLogin yes
# 重启服务
systemctl restart ssh

使用ctrl+alt+F3打开命令行

二 中间件部署

本次部署:Redis,MySQL,Nacos,RabbitMQ

1.创建本地工作目录

中间部署时,需要编写或生成一些文件,我们将这些文件需要统一存储起来方便管理和后期维护

创建/deploy工作目录

在/deploy下创建dev/app,创建开发环境下的中间件的目录

在/dev/app下再创建不同中间件对应的目录下,比如redis,mysql,nacos

2.准备配置/数据初始化文件

(1)MySql数据初始化

①Mysql用户的创建:不能直接使用root用户来进行开发,因为root用户权限太高,安全性太低,我们创建一个新用户并赋予有限权限即可

②Mysql比特脚手架数据库的创建

③Nacos数据初始化,Nacos本身也需要使用Mysql作为外置数据库

意义:

(Ⅰ)数据持久性

(Ⅱ)保证Nacos服务的高可用性:一般生产环境都是在集群环境下使用Nacos,要保证Nacos数据的共享一致,使用内置数据库不好做到,包括Mysql内部也自带高可用性和故障转移

(Ⅲ)性能优化:外置的Mysql可以根据需要进行优化和扩展

(Ⅳ)易于管理和维护:统一采用Mysql,易于统一进行维护和管理

(2)Nacos配置

注:出于安全性的考虑,我们开启Nacos用户鉴权功能

在/deploy/dev/app/nacos/conf/application.properties添加该内容

XML 复制代码
# spring
server.servlet.contextPath=${SERVER_SERVLET_CONTEXTPATH:/nacos}
server.contextPath=/nacos
server.port=${NACOS_APPLICATION_PORT:8848}
server.tomcat.accesslog.max-days=30
server.tomcat.accesslog.pattern=%h %l %u %t "%r" %s %b %D %{User-Agent}i %
{Request-Source}i
#⽇志信息 开发环境开启,后续⽣产看下性能影响
server.tomcat.accesslog.enabled=${TOMCAT_ACCESSLOG_ENABLED:false}
server.error.include-message=ALWAYS
# default current work dir
server.tomcat.basedir=/home/bit/nacos/tomcat/logs
#*************** Config Module Related Configurations ***************#
### Deprecated configuration property, it is recommended to use
`spring.sql.init.platform` replaced.
#spring.datasource.platform=${SPRING_DATASOURCE_PLATFORM:}
spring.sql.init.platform=${SPRING_DATASOURCE_PLATFORM:mysql}
nacos.cmdb.dumpTaskInterval=3600
nacos.cmdb.eventTaskInterval=10
nacos.cmdb.labelTaskInterval=300
nacos.cmdb.loadDataAtStart=false
db.num=${MYSQL_DATABASE_NUM:1}
db.url.0=jdbc:mysql://${MYSQL_SERVICE_HOST}:${MYSQL_SERVICE_PORT:3306}/${MYSQL
_SERVICE_DB_NAME}?
${MYSQL_SERVICE_DB_PARAM:characterEncoding=utf8&connectTimeout=1000&socketTime
out=3000&autoReconnect=true&useSSL=false}
db.user.0=${MYSQL_SERVICE_USER}
db.password.0=${MYSQL_SERVICE_PASSWORD}
### The auth system to use, currently only 'nacos' and 'ldap' is supported:
nacos.core.auth.system.type=${NACOS_AUTH_SYSTEM_TYPE:nacos}
### worked when nacos.core.auth.system.type=nacos
### The token expiration in seconds:
nacos.core.auth.plugin.nacos.token.expire.seconds=${NACOS_AUTH_TOKEN_EXPIRE_SE
CONDS:18000}
### The default token:
#nacos.core.auth.plugin.nacos.token.secret.key=${NACOS_AUTH_TOKEN:}+
nacos.core.auth.plugin.nacos.token.secret.key=VGhpc0lzTXlDdXN0b21TZWNyZXRLZXkw
MTIzNDU2Nzg=
### Turn on/off caching of auth information. By turning on this switch, the
update of auth information would have a 15 seconds delay.
nacos.core.auth.enabled=true
nacos.core.auth.caching.enabled=${NACOS_AUTH_CACHE_ENABLE:false}
nacos.core.auth.enable.userAgentAuthWhite=${NACOS_AUTH_USER_AGENT_AUTH_WHITE_E
NABLE:false}
nacos.core.auth.server.identity.key=${NACOS_AUTH_IDENTITY_KEY:ZHKUSSSDKEY1@761
86138}
nacos.core.auth.server.identity.value=${NACOS_AUTH_IDENTITY_VALUE:ZHKUSSS@4564
6YUI138}
## spring security config
### turn off security
nacos.security.ignore.urls=${NACOS_SECURITY_IGNORE_URLS:/,/error,/**/*.css,/**
/*.js,/**/*.html,/**/*.map,/**/*.svg,/**/*.png,/**/*.ico,/consolefe/public/**,/v1/auth/**,/v1/console/health/**,/actuator/**,/v1/console/server
/**}
# metrics for elastic search
management.metrics.export.elastic.enabled=false
management.metrics.export.influx.enabled=false
nacos.naming.distro.taskDispatchThreadCount=10
nacos.naming.distro.taskDispatchPeriod=200
nacos.naming.distro.batchSyncKeyCount=1000
nacos.naming.distro.initDataRatio=0.9
nacos.naming.distro.syncRetryDelay=5000
nacos.naming.data.warmup=true
nacos.naming.empty-service.auto-clean=true
nacos.naming.empty-service.clean.initial-delay-ms=50000
nacos.naming.empty-service.clean.period-time-ms=30000
management.endpoints.web.exposure.include=*
nacos.istio.mcp.server.enabled=false

关键配置:

nacos.core.auth.enabled=true

nacos.core.auth.server.identity.key=${NACOS_AUTH_IDENTITY_KEY:ZHKUSSSDKEY1@761

86138}

nacos.core.auth.server.identity.value=${NACOS_AUTH_IDENTITY_VALUE:ZHKUSSS@4564

6YUI138}

说明:开启登录鉴权,并且从环境变量里去读取用户名和密码,如果读取不到则使用默认的值,ZHKUSSSDKEY1@76186138和ZHKUSSS@45646YUI138

(3)Redis配置

在/deploy/dev/app/redis/conf/redis.conf下写入

关键修改配置文件此处:

XML 复制代码
requirepass zhku@123

说明:设置redis登录使用的密码

3.编写docker-compose

配置在app目录下,保证文件里的相对路径互相匹配

(1)详解

①挂载(volumes):主要目的是将主机上的一个目录挂载到容器内的指定目录以实现数据的持久化和共享

作用:

(Ⅰ)在中间件的部署过程中,可能因为异常或者其他原因销毁容器,此时如果不对存储的数据进行挂载,那么服务器中已产生的数据会丢失

(Ⅱ)将配置或者初始化文件,同步到容器内部从而使得配置文件或者初始化文件生效

挂载日志文件的好处:虽然可能中间件删除了,但是还想知道当时的文件出现问题是什么情况,可以再去进行排查

②command:指定启动Mysql数据库的一系列参数

③healthcheck(健康检查)的参数:

test:指定用于检查容器健康状态的命令

start_period:容器启动之后,开始执行健康检查前等待的时间

interval:健康检查的间隔

timeout:健康检查命令的超时时间

retries:在认为容器不健康之前,连续失败的健康检查次数

healthcheck(健康检查)通常搭配depends_on进行使用,当当前服务的启动依赖于其他服务时,就可以使用depends_on,写出其依赖的服务名以及其健康状态

比如nacos依赖于外置数据库mysql,因此其启动的时候需要先对mysql进行健康检查,确保其是健康的才进行部署

④ulimits:

对线程和文件描述符进行限制,可以起到两个作用,一个是性能优化,一个是保证系统稳定,加上有些黑客可能会做一些操作,如果在这块不做限制的话可能会导致安全问题,侵占我们的系统的资源

⑤image:镜像

注:已经配置了网络,在同一个网络下此时就可以直接通过服务名称来进行连接了

⑥commad:启动时执行的命令

⑦hostname:后期集群环境中用于各节点问题通信和提高各节点辨识度

(2)文件配置参考

XML 复制代码
version: '3.8'
#启动命令 docker compose -p frameworkjava -f docker-compose-mid.yml up -d
services:
  frameworkjava-mysql:
    container_name: frameworkjava-mysql
    image: mysql:8.4.2
    ports:
      - "3306:3306"
    volumes:
      # 数据挂载
      - ../data/frameworkjavadata/mysql/data:/var/lib/mysql
      # 配置挂载
      - ./mysql/init/init.sql:/docker-entrypoint-initdb.d/init.sql
      - ./mysql/sql:/opt/sql
    command: [
      'mysqld',
      '--innodb-buffer-pool-size=80M',
      '--character-set-server=utf8mb4',
      '--collation-server=utf8mb4_unicode_ci',
      '--default-time-zone=+8:00',
      '--lower-case-table-names=1',
      '--explicit_defaults_for_timestamp=true',
      '--server-id=1',
      '--log-bin=mysql-bin',
      '--binlog-ignore-db=mysql',
      '--binlog-cache-size=256M',
      '--binlog-format=ROW',
      '--max_connections=2000'
    ]
    restart: always
    networks:
      - frameworkjava_network
    healthcheck:
      test: mysql --user=<your_mysql_user> -h127.0.0.1 --password='<your_mysql_password>' -e "SELECT 1;"
      start_period: 30s
      interval: 10s
      timeout: 5s
      retries: 10
    environment:
      TZ: Asia/Shanghai
      MYSQL_ROOT_PASSWORD: <your_mysql_root_password>
    ulimits:
      nproc: 65535
      nofile:
        soft: 20000
        hard: 40000

  frameworkjava-nacos:
    container_name: frameworkjava-nacos
    image: nacos/nacos-server:v2.2.2
    environment:
      - MODE=standalone
      - JVM_XMS=512m
      - JVM_XMX=512m
      - JVM_XMN=256m
      - SPRING_DATASOURCE_PLATFORM=mysql
      - MYSQL_SERVICE_HOST=frameworkjava-mysql
      - MYSQL_SERVICE_PORT=3306
      - MYSQL_SERVICE_DB_NAME=frameworkjava_nacos_dev
      - MYSQL_SERVICE_USER=<your_mysql_user>
      - MYSQL_SERVICE_PASSWORD=<your_mysql_password>
    volumes:
      - ../data/frameworkjavadata/nacos/logs/:/home/nacos/logs
      - ../data/frameworkjavadata/nacos/tomcatlogs/:/home/bit/nacos/tomcat/logs/
      - ./nacos/conf/application.properties:/home/nacos/conf/application.properties
    ports:
      - "8848:8848"
      - "9848:9848"
      - "9849:9849"
    restart: always
    networks:
      - frameworkjava_network
    depends_on:
      frameworkjava-mysql:
        condition: service_healthy
    healthcheck:
      test: [ "CMD", "curl", "-f", "http://localhost:8848/nacos" ]
      start_period: 30s
      interval: 10s
      timeout: 10s
      retries: 10

  frameworkjava-redis:
    container_name: frameworkjava-redis
    image: redis:7.0.15
    ports:
      - "6379:6379"
    volumes:
      - ./redis/conf/redis.conf:/usr/local/etc/redis/redis.conf
      - ../data/frameworkjavadata/redis/data:/data
    command: redis-server /usr/local/etc/redis/redis.conf
    restart: always
    networks:
      - frameworkjava_network
    healthcheck:
      test: [ "CMD", "redis-cli", "ping" ]
      interval: 10s
      timeout: 5s
      retries: 10

  frameworkjava-rabbitmq:
    image: rabbitmq:3.12.6-management
    container_name: frameworkjava-rabbitmq
    restart: always
    hostname: frameworkjava-rabbitmq
    environment:
      RABBITMQ_DEFAULT_USER: <your_rabbitmq_user>
      RABBITMQ_DEFAULT_PASS: <your_rabbitmq_password>
    ports:
      - "5672:5672"
      - "15672:15672"
    volumes:
      - ../data/frameworkjavadata/rabbitmq/log:/var/log/rabbitmq
      - ../data/frameworkjavadata/rabbitmq/data:/var/lib/rabbitmq
    networks:
      - frameworkjava_network
    healthcheck:
      test: [ "CMD", "rabbitmqctl", "status" ]
      interval: 10s
      timeout: 10s
      retries: 10

networks:
  frameworkjava_network:

4.执行docker-compose文件

(1)使用Xftp将放对应文件的目录进行上传,在/dev/deploy/app下执行下面启动语句

XML 复制代码
docker compose -p framework-java -f docker-compose-mid.yml up -d

此时,显示中间件部署成功,但是我们自身还需要再下载一下软件来验证中间件的状态是ok的

(2)停止中间件运行

XML 复制代码
docker compose -p framework-java -f docker-compose-mid.yml stop

(3)检查中间健康状态

XML 复制代码
docker ps

5.软件安装与验证

(1)DBeaver:用于图形化操作数据库,并且验证数据库是否部署成功

下载链接:https://dbeaver.io/

(2)Another Redis Desktop Manager:操作Redis的图形化界面,可用于验证Redis是否部署成功

(3)查看Nacos是否部署成功

访问:http://你的云服务器外⽹Ip/你的虚拟机内⽹ip:8848/nacos/#/login

(4)查看RabbitMq是否部署成功

访问:http://你的云服务器外⽹Ip/你的虚拟机内⽹ip:15672/#/

三 Nacos集成

1.模板微服务的创建

补充:如果需要在控制台显示一些品牌信息可以在resources下添加banner.txt文件,其就会对应显示

(1)创建意义:

①很多业务微服务的创建其实都是相类似的,可以提取出一份模板

②可以用验证nacos的集成,因为nacos集成前还有现成的服务

(2)引入bootstrap.yml:

XML 复制代码
spring:
  application:
    name: bite-mstemplate

  profiles:
    active: ${RUN_ENV}

  cloud:
    nacos:
      discovery:
        username: nacos
        password: zhku@123
        namespace: frameworkjava-${RUN_ENV}
        server-addr: ${NACOS_ADDR}

      config:
        username: nacos
        password: zhku@123
        namespace: frameworkjava-${RUN_ENV}
        server-addr: ${NACOS_ADDR}
        file-extension: yaml

# 这⼀配置⽤于定义应⽤在控制台输出⽇志时所遵循的格式规则
logging:
  pattern:
    console: '[%thread] %-5level %logger{36} - %msg%n'

说明:此处引入${RUN_ENV}方便在nacos对不同环境下的配置进行变换,包括命名空间也是根据当前环境去进行变换,因此此处需要设为变量

注:那么服务启动的时候需要配上对应的环境变量:NACOS_ADDR=http://你的云服务器外⽹ip/你的虚拟机内⽹ip:8848;RUN_ENV=dev

四 网关集成解决方案

1.网关服务创建成功

2.网关服务配置成功

在nacos配置中心进行配置,方便后续随时进行调整

XML 复制代码
server:
  port: 18080

spring:
  cloud:
    gateway:
      routes:
        # 管理模块
        - id: bite-mstemplate
          uri: lb://zhku-mstemplate
          predicates:
            - Path=/mstemplate/**
          filters:
            - StripPrefix=1

StripPrefix=1:全局过滤器,将前面统一的路径/mstemplate去掉,再转发到后端服务器

3.网关服务核心功能验证成功

相关推荐
Jabes.yang1 小时前
Java电商订单系统面试全流程解析:接口设计、数据库、微服务与分布式事务实战
java·微服务·mybatis·分布式事务·电商·订单系统·接口设计
码语智行1 小时前
导入模板下载
java
摇滚侠1 小时前
IDEA 创建 Java 项目 推送到远程 Git 仓库
java·git·intellij-idea
可乐ea1 小时前
【知识获取与分享社区项目 | 项目日记第 24 天】终章总结:从认证、发布、计数、Feed、搜索到 RAG:完整复盘一个知识社区后端系统
java·spring boot·redis·mysql·elasticsearch·ai·kafka
Jabes.yang1 小时前
Java面试实录:AIGC场景下的Stream、微服务、Redis、Kafka与安全实战
java·spring boot·redis·微服务·面试·kafka·aigc
lwf0061642 小时前
实战:用 Java 模拟登录阿里云控制台,爬取没有 OpenAPI 的数据
java·阿里云
骄马之死2 小时前
Redis 核心知识点总结
数据库·redis·缓存
basketball6162 小时前
Redis基础:6. 哨兵模式
数据库·redis·bootstrap
努力搬砖的咸鱼2 小时前
容器编排底层原理:Kubernetes 网络模型与 CNI 插件
网络·微服务·云原生·容器·架构·kubernetes