springboot第24集:架构mongodbmanager,Redis,Mybatis,Spring Security

e93ee59b1cadd582526ed9699abbff9a.png

image.png
30fd824e101fa10fef107af8053e6aa1.png
image.png
188169dbb159e4c1146dd4acb5d17fd6.png
image.png
41bb87c9ae29a36fabeba218f3f65047.png
image.png
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-pool2</artifactId>
</dependency>

Spring Boot 提供了对 Redis 集成的组件包:spring-boot-starter-data-redisspring-boot-starter-data-redis依赖于spring-data-redis 和 lettuce 。

Lettuce 是一个可伸缩线程安全的 Redis 客户端,多个线程可以共享同一个 RedisConnection,它利用优秀 netty NIO 框架来高效地管理多个连接。

# Redis数据库索引(默认为0)
spring.redis.database=0  
# Redis服务器地址
spring.redis.host=localhost
# Redis服务器连接端口
spring.redis.port=6379  
# Redis服务器连接密码(默认为空)
spring.redis.password=
# 连接池最大连接数(使用负值表示没有限制) 默认 8
spring.redis.lettuce.pool.max-active=8
# 连接池最大阻塞等待时间(使用负值表示没有限制) 默认 -1
spring.redis.lettuce.pool.max-wait=-1
# 连接池中的最大空闲连接 默认 8
spring.redis.lettuce.pool.max-idle=8
# 连接池中的最小空闲连接 默认 0
spring.redis.lettuce.pool.min-idle=0

Spring Session 提供了一套创建和管理 Servlet HttpSession 的方案。Spring Session 提供了集群 Session(Clustered Sessions)功能,默认采用外置的 Redis 来存储 Session 数据,以此来解决 Session 共享的问题。

在启动类中添加对 mapper 包扫描@MapperScan

@SpringBootApplication
@MapperScan("com.xxx.mapper")
public class MybatisAnnotationApplication {

	public static void main(String[] args) {
		SpringApplication.run(MybatisAnnotationApplication.class, args);
	}
}

或者直接在 Mapper 类上面添加注解@Mapper

public interface UserMapper {
	
	@Select("SELECT * FROM users")
	@Results({
		@Result(property = "userSex",  column = "user_sex", javaType = UserSexEnum.class),
		@Result(property = "nickName", column = "nick_name")
	})
	List<UserEntity> getAll();
	
	@Select("SELECT * FROM users WHERE id = #{id}")
	@Results({
		@Result(property = "userSex",  column = "user_sex", javaType = UserSexEnum.class),
		@Result(property = "nickName", column = "nick_name")
	})
	UserEntity getOne(Long id);

	@Insert("INSERT INTO users(userName,passWord,user_sex) VALUES(#{userName}, #{passWord}, #{userSex})")
	void insert(UserEntity user);

	@Update("UPDATE users SET userName=#{userName},nick_name=#{nickName} WHERE id =#{id}")
	void update(UserEntity user);

	@Delete("DELETE FROM users WHERE id =#{id}")
	void delete(Long id);

}
mybatis.config-location=classpath:mybatis/mybatis-config.xml
mybatis.mapper-locations=classpath:mybatis/mapper/*.xml

mybatis-config.xml 配置

<configuration>
	<typeAliases>
		<typeAlias alias="Integer" type="java.lang.Integer" />
		<typeAlias alias="Long" type="java.lang.Long" />
		<typeAlias alias="HashMap" type="java.util.HashMap" />
		<typeAlias alias="LinkedHashMap" type="java.util.LinkedHashMap" />
		<typeAlias alias="ArrayList" type="java.util.ArrayList" />
		<typeAlias alias="LinkedList" type="java.util.LinkedList" />
	</typeAliases>
</configuration>

RabbitMQ 是实现 AMQP(高级消息队列协议)的消息中间件的一种,最初起源于金融系统,用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现不俗。 RabbitMQ 主要是为了实现系统之间的双向解耦而实现的。当生产者大量产生数据时,消费者无法快速消费,那么需要一个中间层。保存这个数据。

AMQP,即 Advanced Message Queuing Protocol,高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。消息中间件主要用于组件之间的解耦,消息的发送者无需知道消息使用者的存在,反之亦然。AMQP 的主要特征是面向消息、队列、路由(包括点对点和发布/订阅)、可靠性、安全。

RabbitMQ 是一个开源的 AMQP 实现,服务器端用Erlang语言编写,支持多种客户端,如:Python、Ruby、.NET、Java、JMS、C、PHP、ActionScript、XMPP、STOMP 等,支持 AJAX。用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现不俗。

  • 虚拟主机:一个虚拟主机持有一组交换机、队列和绑定。为什么需要多个虚拟主机呢?很简单, RabbitMQ 当中,用户只能在虚拟主机的粒度进行权限控制。  因此,如果需要禁止A组访问B组的交换机/队列/绑定,必须为A和B分别创建一个虚拟主机。每一个 RabbitMQ 服务器都有一个默认的虚拟主机“/”。

  • 交换机:Exchange 用于转发消息,但是它不会做存储 ,如果没有 Queue bind 到 Exchange 的话,它会直接丢弃掉 Producer 发送过来的消息。 这里有一个比较重要的概念:路由键 。消息到交换机的时候,交互机会转发到对应的队列中,那么究竟转发到哪个队列,就要根据该路由键。

  • 绑定:也就是交换机需要和队列相绑定

交换机的功能主要是接收消息并且转发到绑定的队列,交换机不存储消息,在启用ack模式后,交换机找不到队列会返回错误。交换机有四种类型:Direct, topic, Headers and Fanout

Spring Boot 集成 RabbitMQ 非常简单,如果只是简单的使用配置非常少,Spring Boot 提供了spring-boot-starter-amqp 项目对消息各种支持。

简单使用

1、配置 Pom 包,主要是添加 spring-boot-starter-amqp 的支持

<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>

2、配置文件

配置 RabbitMQ 的安装地址、端口以及账户信息

spring.application.name=Spring-boot-rabbitmq

spring.rabbitmq.host=192.168.0.86
spring.rabbitmq.port=5672
spring.rabbitmq.username=admin
spring.rabbitmq.password=123456

发送邮件

pom 包里面添加 spring-boot-starter-mail 包引用

<dependencies>
	<dependency> 
	    <groupId>org.springframework.boot</groupId>
	    <artifactId>spring-boot-starter-mail</artifactId>
	</dependency> 
</dependencies>

ValidateCode类 只存放验证码和过期时间

import java.time.LocalDateTime;
import lombok.Data;
@Data
public class ValidateCode {
 private String code;
 private LocalDateTime expireTime;
 public ValidateCode(String code, int expireIn) {
  this.code = code;
  this.expireTime = LocalDateTime.now().plusSeconds(expireIn);
 }
 public boolean isExpried() {
  return LocalDateTime.now().isAfter(getExpireTime());
 }
 public ValidateCode(String code, LocalDateTime expireTime) {
  super();
  this.code = code;
  this.expireTime = expireTime;
 }
}
import org.springframework.web.context.request.ServletWebRequest;
public interface ValidateCodeGenerator {
 ValidateCode generate(ServletWebRequest request);
}
// 短信验证码生成器
@Component("smsCodeGenerator")
public class SmsCodeGenerator implements ValidateCodeGenerator {
 @Override
 public ValidateCode generate(ServletWebRequest request) {
  String code = RandomStringUtils.randomNumeric(SecurityConstants.SMS_RANDOM_SIZE);
  return new ValidateCode(code, SecurityConstants.SMS_EXPIRE_SECOND);
 }
}
public interface SmsCodeSender {
 void send(String mobile, String code)
}
1bb13bcca29d613980f1e6da5a6230ad.png
image.png
技术 说明 官网
Spring Boot 容器+MVC框架 https://spring.io/projects/spring-boot
Spring Security 认证和授权框架 https://spring.io/projects/spring-security
Mybatis ORM框架 http://www.mybatis.org/mybatis-3/zh/index.html
MyBatisGenerator 数据层代码生成 http://www.mybatis.org/generator/index.html
PageHelper MyBatis物理分页插件 http://git.oschina.net/free/Mybatis_PageHelper
Swagger-UI 文档生成工具 https://github.com/swagger-api/swagger-ui
Elasticsearch 搜索引擎 https://github.com/elastic/elasticsearch
RabbitMq 消息队列 https://www.rabbitmq.com/
Redis 分布式缓存 https://redis.io/
MongoDb 文档型数据库 https://www.mongodb.com/
zookeeper 分布式锁 https://zookeeper.apache.org/
Docker 应用容器引擎 https://www.docker.com/
Druid 数据库连接池 https://github.com/alibaba/druid
OSS 对象存储 https://github.com/aliyun/aliyun-oss-java-sdk
JWT JWT登录支持 https://github.com/jwtk/jjwt
LogStash 日志收集 https://github.com/logstash/logstash-logback-encoder
Lombok 简化对象封装工具 https://github.com/rzwitserloot/lombok
Seata 全局事务管理框架 https://github.com/seata/seata
Portainer 可视化Docker容器管理 https://github.com/portainer/portainer
canal 数据同步 https://github.com/alibaba/canal
41ca63b4f0fb797681a6f04e64ab8790.png
image.png
6d2629d224bd6c01bacd2eb934e4d373.png
image.png
0da3f91aba7a73dbdd23d35cd0201696.png
image.png

https://www.rabbitmq.com/install-homebrew.html

da0d38044545bfd56c16df3ea049beb9.png
image.png

redis、mongodb 和 rabbitmq

spring:  
datasource:  
url:jdbc:mysql://localhost:3306/xxx?serverTimezone=UTC&useSSL=false&useUnicode=true&characterEncoding=UTF-8  
username:druid  
password:druid705  
druid:  
initial-size:5#连接池初始化大小  
min-idle:10#最小空闲连接数  
max-active:20#最大连接数  
web-stat-filter:  
exclusions:"*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*"#不统计这些请求数据  
stat-view-servlet:#访问监控网页的登录用户名和密码  
login-username:druid  
login-password:druid  
data:  
mongodb:  
host:134.175.187.61  
uri:mongodb://mongod:<password>@134.175.187.61:27017/test  
redis:  
host:134.175.187.61# Redis服务器地址  
database:0# Redis数据库索引(默认为0)  
port:6379# Redis服务器连接端口  
password:# Redis服务器连接密码(默认为空)  
jedis:  
pool:  
max-active:8# 连接池最大连接数(使用负值表示没有限制)  
max-wait:-1ms# 连接池最大阻塞等待时间(使用负值表示没有限制)  
max-idle:8# 连接池中的最大空闲连接  
min-idle:0# 连接池中的最小空闲连接  
timeout:3000ms# 连接超时时间(毫秒)  
rabbitmq:  
host:localhost  
port:5672  
virtual-host:/#xxx  
username:admin  
password:admin123  
publisher-confirms:true#如果对异步消息需要回调必须设置为true

腾讯云服务器上的mongodb数据库连接

spring:  
datasource:  
url:jdbc:mysql://localhost:3306/xxx`?serverTimezone=UTC&useSSL=false&useUnicode=true&characterEncoding=UTF-8  
username:druid  
password:druid705  
druid:  
initial-size:5#连接池初始化大小  
min-idle:10#最小空闲连接数  
max-active:20#最大连接数  
web-stat-filter:  
exclusions:"*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*"#不统计这些请求数据  
stat-view-servlet:#访问监控网页的登录用户名和密码  
login-username:druid  
login-password:druid  
data:  
elasticsearch:  
repositories:  
enabled:true  
cluster-nodes:localhost:9200  
cluster-name:elasticsearch  
elasticsearch:  
rest:  
uris:["http://localhost:9200"]

报错:

错误:rpmdb:BDB0113 线程/进程 12788/140191014115392 失败:BDB1507 线程在 Berkeley DB 库中死亡 错误:来自 dbenv->failchk 的 db5 错误(-30973):BDB0087 DB_RUNRECOVERY:致命错误,运行数据库恢复 错误:无法使用 db5 打开 /var/lib/rpm 中的 Packages 索引 - (-30973) 错误:无法在 /var/lib/rpm 中打开 Packages 数据库 CRITICAL:yum.main:

错误:rpmdb 打开失败

Zookeeper是一个开源的分布式协调服务,它可以用于管理和协调分布式应用程序,提供分布式锁、命名服务、配置管理、集群管理等功能。下载Zookeeper可以用于构建高可用性、可伸缩性的分布式系统,并且它广泛应用于大型分布式存储、消息队列、Hadoop集群等领域。如果您需要构建或者管理分布式系统,那么Zookeeper将会是一个非常有用的工具。

Zookeeper是一个开源的分布式协调服务,主要用于分布式应用程序的协调与管理。

安装Nacos

解压并移动至安装目录

tar -zxvf nacos-server-1.4.1.tar.gz -C /usr/local/

创建名为nacos_config的数据库,之后使用 MySQL 客户端执行 /usr/local/nacos/conf/nacos-mysql.sql 文件,完成建表工作。

打开 Nacos 服务器中的核心配置文件 application.properties,文件路径如下:

/usr/local/nacos/conf/application.properties

定位到 33 行 spring.datasource.platform “数据源”配置附近,默认数据源配置都被#号注释,删除注释按下方示例配置数据源即可。

### 设置数据库类型
spring.datasource.platform=mysql

### 数据库的数量,可配置多个数据:
db.num=1

### 数据库连接信息:
db.url.0=jdbc:mysql://127.0.0.1:3306/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
db.user.0=nacos_config
db.password.0=password

设置集群配置

配置多台(至少三台)Nacos服务后,执行如下命令创建集群配置文件:

cp /usr/local/nacos/cluster.conf.example /usr/local/nacos/cluster.conf

将集群节点按如下格式配置在文件中,默认8848端口可不配置

\#it is ip

# example

192.168.16.101:8847
192.168.16.102
192.168.16.103
b4d6457d908c4ef993c6b766bc6b0e10.png
image.png
cd /usr/local/nacos

# 以单机模式运行

bash startup.sh -m standalone

# 以集群模式运行

bash startup.sh

https://github.com/alibaba/nacos/releases

  • 解压安装包,直接运行bin目录下的startup.cmd

  • 运行成功后,访问http://localhost:8848/nacos可以查看Nacos的主页,默认账号密码都是nacos。

  • 创建nacos-user-service模块和nacos-ribbon-service模块;

<dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>2.1.0.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
  • 修改相关依赖,把原来的Consul注册发现的依赖改为Nacos的:

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
  • 修改配置文件application.yml,将Consul的注册发现配置改为Nacos的:

server:
  port: 8206
spring:
  application:
    name: nacos-user-service
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848 #配置Nacos地址
management:
  endpoints:
    web:
      exposure:
        include: '*'

创建nacos-config-client模块

  • 在pom.xml中添加相关依赖:

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
  • 添加配置文件application.yml,启用的是dev环境的配置:

spring:
  profiles:
    active: dev
  • 添加配置文件bootstrap.yml,主要是对Nacos的作为配置中心的功能进行配置:

server:
  port: 9101
spring:
  application:
    name: nacos-config-client
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848 #Nacos地址
      config:
        server-addr: localhost:8848 #Nacos地址
        file-extension: yaml #这里我们获取的yaml格式的配置
  • 创建ConfigClientController,从Nacos配置中心中获取配置信息:

@RestController
@RefreshScope
public class ConfigClientController {

    @Value("${config.info}")
    private String configInfo;

    @GetMapping("/configInfo")
    public String getConfigInfo() {
        return configInfo;
    }
}
06b6030e42056047ce0b6c1e38f1923e.png
image.png
28e32bd3e7c83f313e52380e15c8b7e8.png
image.png

start_zookeeper.sh

/usr/local/kafka/bin/zookeeper-server-start.sh /usr/local/kafka/config/zookeeper.properties >zookeeper.log 2>&1 &

start_kafka.sh

/usr/local/kafka/bin/kafka-server-start.sh /usr/local/kafka/config/server.properties >kafka.log 2>&1 &

Nacos 的运行是需要数据库的,它支持两种数据库:本地数据库 Derby、和 MySQL 数据库。 所以对应的启动命令有以下几种:

  • Derby 数据库运行单机模式:docker-compose -f example/standalone-derby.yaml up

  • MySQL 5.7 数据库运行单机模式:docker-compose -f example/standalone-mysql-5.7.yaml up

  • MySQL 8 数据库运行单机模式:docker-compose -f example/standalone-mysql-8.yaml up

集群模式启动:docker-compose -f example/cluster-hostname.yaml up

你收到的错误消息表明你的系统上未安装 docker-compose 命令,或者它没有在系统的 PATH 环境变量中。

假设你已经安装了 Docker,你可以按照以下步骤安装 docker-compose

  1. 打开终端窗口。

  2. 运行以下命令下载最新版本的 docker-compose

sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

这将下载 docker-compose 二进制文件并存储在 /usr/local/bin 目录中。

  1. 将 docker-compose 二进制文件设置为可执行:

sudo chmod +x /usr/local/bin/docker-compose

4.  运行以下命令验证 docker-compose 是否已正确安装:

docker-compose --version

这应该显示刚刚安装的 docker-compose 版本号。

安装完 docker-compose 后,你可以尝试再次运行你的命令。

升级 Docker 版本可以解决许多问题,包括与已弃用的标志和命令相关的问题。以下是升级 Docker 的步骤:

  1. 首先,您需要确定当前安装的 Docker 版本。可以在终端中运行以下命令:

docker version

该命令将显示 Docker 客户端和服务器的版本信息。

  1. 下载并安装最新版本的 Docker。可以根据您的操作系统从 Docker 官网下载适当的安装程序。如果您使用的是 Linux 系统,则可以运行以下命令来升级 Docker:

sudo apt-get update && sudo apt-get install docker-ce

这将更新软件包列表并安装最新版本的 Docker。

  1. 安装完毕后,您需要重新启动 Docker 服务。可以使用以下命令完成此操作:

sudo systemctl restart docker

4.  最后,您可以再次运行以下命令来验证 Docker 版本:

docker version

如果所有步骤都无误,您应该看到已安装最新版本的 Docker。请注意,在升级过程中可能会丢失一些数据或配置文件,请确保备份重要数据并跟随官方文档的建议进行操作。

这个错误通常是因为您正在运行的系统不是基于 Debian 或 Ubuntu 的系统,而 apt-get 命令只能在这些系统上使用。如果您正在运行其他系统(例如 CentOS、Fedora 或 macOS),则需要使用适当的包管理器或手动安装 Docker。

以下是一些在不同操作系统上安装 Docker 的方法:

  • 对于 CentOS,可以使用 yum 包管理器来安装 Docker:sudo yum install docker-ce

  • 对于 Fedora,可以使用 dnf 包管理器来安装 Docker:sudo dnf install docker-ce

  • 对于 macOS,可以从 Docker 官网下载 Docker for Mac 并进行安装。

Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。 Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。 Nacos 是构建以“服务”为中心的现代应用架构 (例如微服务范式、云原生范式) 的服务基础设施。

下载的是Linux环境下最新稳定版本nacos-server-2.0.3.tar.gz包,并能使用FinalShell云服务器客户端连接工具登录云服务器后上传到云服务器的/usr/local目录下:

然后执行解压缩命令并切换到nacos/bin目录:

启动服务: 切换到nacos/bin目录下后执行启动nacos服务命令(启动命令standalone代表着单机模式运行,非集群模式)

sh startup.sh -m standalone

nacos is starting with standalone
nacos is starting, you can check the /usr/local/nacos/nacos/logs/start.out

默认 Nacos 以后台模式启动,利用 tail 命令查看启动日志。可以看到 Nacos 默认端口为 8848

tail -f ./logs/start.out
fcccbe1af32b1b56461f54505ba402a1.png
image.png
4a83eab5943eff0d9c0d8e05c8e39976.png
image.png
62a31fcc47c26a8ddee073da4b6a51ea.png
image.png
6aaa348c34d79b54416dfdfdc6dd74af.png
image.png

https://www.elastic.co/cn/kibana/

https://grafana.com/

ef3d15a1710794d0dcb9a29dfc82d824.png
image.png
docker pull containerize/elastichd

Quick Start:

docker run -p 9200:9200 -d --name elasticsearch elasticsearch
docker run -p 9800:9800 -d --link elasticsearch:demo containerize/elastichd

https://github.com/dushixiang/kafka-map

Nacos Docker 快速开始

操作步骤

  • Clone 项目

    git clone https://github.com/nacos-group/nacos-docker.git
    cd nacos-docker
  • 单机模式 Derby

    docker-compose -f example/standalone-derby.yaml up
  • 单机模式 MySQL

如果希望使用MySQL5.7

docker-compose -f example/standalone-mysql-5.7.yaml up

如果希望使用MySQL8

docker-compose -f example/standalone-mysql-8.yaml up
  • 集群模式

    docker-compose -f example/cluster-hostname.yaml up
  • 服务注册

    curl -X POST 'http://127.0.0.1:8848/nacos/v1/ns/instance?serviceName=nacos.naming.serviceName&ip=20.18.7.10&port=8080'
  • 服务发现

    curl -X GET 'http://127.0.0.1:8848/nacos/v1/ns/instance/list?serviceName=nacos.naming.serviceName'
  • 发布配置

    curl -X POST "http://127.0.0.1:8848/nacos/v1/cs/configs?dataId=nacos.cfg.dataId&group=test&content=helloWorld"
  • 获取配置

    curl -X GET "http://127.0.0.1:8848/nacos/v1/cs/configs?dataId=nacos.cfg.dataId&group=test"
  • Nacos 控制台

    link:http://127.0.0.1:8848/nacos/

    sh startup.sh -m standalone

nacos is starting with standalone
nacos is starting,you can check the /usr/local/nacos/logs/start.out

服务注册&发现和配置管理

服务注册

curl -X POST 'http://127.0.0.1:8848/nacos/v1/ns/instance?serviceName=nacos.naming.serviceName&ip=20.18.7.10&port=8080'

服务发现

curl -X GET 'http://127.0.0.1:8848/nacos/v1/ns/instance/list?serviceName=nacos.naming.serviceName'

发布配置

curl -X POST "http://127.0.0.1:8848/nacos/v1/cs/configs?dataId=nacos.cfg.dataId&group=test&content=HelloWorld"

获取配置

curl -X GET "http://127.0.0.1:8848/nacos/v1/cs/configs?dataId=nacos.cfg.dataId&group=test"

5.关闭服务器

Linux/Unix/Mac

sh shutdown.sh

Nacos Docker

Quick Start

docker run --name nacos-quick -e MODE=standalone -p 8849:8848 -d nacos/nacos-server:2.0.2

Advanced Usage

  • Tips: You can change the version of the Nacos image in the compose file from the following configuration. example/.env

NACOS_VERSION=2.0.2

Run the following command:

  • Clone project

    git clone --depth 1 https://github.com/nacos-group/nacos-docker.git
    cd nacos-docker
  • Standalone Derby

    docker-compose -f example/standalone-derby.yaml up
  • Standalone Mysql

    # Using mysql 5.7
    docker-compose -f example/standalone-mysql-5.7.yaml up
    
    # Using mysql 8
    docker-compose -f example/standalone-mysql-8.yaml up
  • Cluster

    docker-compose -f example/cluster-hostname.yaml up
  • Service registration

    curl -X PUT 'http://127.0.0.1:8848/nacos/v1/ns/instance?serviceName=nacos.naming.serviceName&ip=20.18.7.10&port=8080'
  • Service discovery

    curl -X GET 'http://127.0.0.1:8848/nacos/v1/ns/instances?serviceName=nacos.naming.serviceName'
  • Publish config

    curl -X POST "http://127.0.0.1:8848/nacos/v1/cs/configs?dataId=nacos.cfg.dataId&group=test&content=helloWorld"
  • Get config

    curl -X GET "http://127.0.0.1:8848/nacos/v1/cs/configs?dataId=nacos.cfg.dataId&group=test"
  • Open the Nacos console in your browser

    link:http://127.0.0.1:8848/nacos/

  1. 开放端口防火墙和安全组

默认 CentOS 系统并没有对外开放 7848/8848 端口,需要设置防火墙对 7848/8848 端口放行。

其中,8848 端口是 Nacos 对客户端提供服务的端口,7848 是 Nacos 集群通信端口,用于Nacos 集群间进行选举,检测等。另外,Nacos 2.0以后增加了用于grpc客户端和服务端通信的长连接9848和9849端口,需要将这两个端口也一并开放。

e1f9cab2e8572b1359e47e03e1201970.png
image.png

登录Nacos的UI管理界面了,用户名和密码都是nacos

4988d047b86bf1fce34ff7072b84d1bb.png
image.png

右侧选中 Custom,写入阿里云地址[start.aliyun.com],默认的 [start.spring.io]。

a0cebfe6ac2e841c4b8d1565b44f068a.png
image.png

界面中的Next按钮后进入Dependencies界面,选中Spring Cloud Alibaba模块后在右侧的依赖项中勾选Nacos Service Discovery;同样选中Web模块后在右侧的依赖项中勾选Spring Web依赖。

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.lagou</groupId>
    <artifactId>nacos-sample</artifactId>
    <version>1.0.0-SNAPSHOT</version>
    <name>nacos-sample</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <spring-boot.version>2.3.7.RELEASE</spring-boot.version>
        <spring-cloud-alibaba.version>2.2.2.RELEASE</spring-cloud-alibaba.version>
    </properties>

    <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.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
    </dependencies>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>${spring-boot.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>${spring-cloud-alibaba.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.1</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                    <encoding>UTF-8</encoding>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>2.3.7.RELEASE</version>
                <configuration>
                    <mainClass>com.lagou.nacossample.NacosSampleApplication</mainClass>
                </configuration>
                <executions>
                    <execution>
                        <id>repackage</id>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
</project>

修改application.properties文件

# 应用名称
spring.application.name=nacos-sample
# 应用服务 WEB 访问端口
server.port=9000
# Nacos帮助文档: https://nacos.io/zh-cn/docs/concepts.html
# Nacos认证信息
spring.cloud.nacos.discovery.username=nacos
spring.cloud.nacos.discovery.password=nacos
# Nacos 服务发现与注册配置,其中子属性 server-addr 指定 Nacos 服务器主机和端口
#spring.cloud.nacos.discovery.server-addr=mse-6d50f4f0-p.nacos-ans.mse.aliyuncs.com:8848
spring.cloud.nacos.discovery.server-addr=http://xxxxxxxx:8848
# 注册到 nacos 的指定 namespace,默认为 public
spring.cloud.nacos.discovery.namespace=public
#spring.cloud.nacos.discovery.endpoint=nacos
spring.cloud.nacos.discovery.log-name=nacosLog
spring.cloud.nacos.discovery.cluster-name=nacos-cluster
spring.cloud.nacos.discovery.group=nacos-group
spring.cloud.loadbalancer.ribbon.enabled=true
management.endpoints.web.exposure.include=*
  • Derby 数据库运行单机模式:docker-compose -f example/standalone-derby.yaml up

  • MySQL 5.7 数据库运行单机模式:docker-compose -f example/standalone-mysql-5.7.yaml up

  • MySQL 8 数据库运行单机模式:docker-compose -f example/standalone-mysql-8.yaml up

docker-compose 是用于定义和运行多容器 Docker 应用程序的编排工具。使用 docker-compose 后不再需要逐一创建和启动容器。您可以使用 YML 文件来配置应用程序需要的所有服务,然后使用一个命令,就可以从 YML 文件配置中创建并启动所有服务。 但是 docker-compose 需要单独安装,否则会出现以下错误

解决方案:

cd /usr/local/bin
wget https://github.com/docker/compose/releases/download/1.14.0-rc2/docker-compose-Linux-x86_64
rename docker-compose-Linux-x86_64 docker-compose docker-compose-Linux-x86_64
chmod +x /usr/local/bin/docker-compose
docker-compose version
b884bbac02a2a75629d09b5b7b1b8639.png
image.png

使用 docker-compose 可能会提示“ERROR: no such image: nacos/nacos-server:: invalid reference format”,无效的参数格式

解决方案:修改 Nacos 源码中 example/standalone-mysql-5.7.yaml 的配置项,将“image: nacos/nacos-server:{ {NACOS_VERSION}}”,修改为:“image: nacos/nacos-server:latest”。

da465384ae458f6f48987f4b0c924b17.png
image.png
a06fe347aeda2a5f2f0de46da2ac3ef6.png
image.png
f0d839d255cead8049ad205cb37a1bfd.png
image.png

Spring Cloud Alibaba Nacos 项目主要有两个依赖项

<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>

在配置文件 application.properties 中要填写 Nacos 的相关信息,具体内容如下:

# 应用名称(也是 Nacos 中的服务名)
spring.application.name=spring-cloud-nacos-producer
# 应用服务 WEB 访问端口
server.port=8082
# Nacos认证信息
spring.cloud.nacos.discovery.username=nacos
spring.cloud.nacos.discovery.password=nacos
# Nacos 服务发现与注册配置,其中子属性 server-addr 指定 Nacos 服务器主机和端口
spring.cloud.nacos.discovery.server-addr=mse-6d50f4f0-p.nacos-ans.mse.aliyuncs.com:8848
# 注册到 nacos 的指定 namespace,默认为 public
spring.cloud.nacos.discovery.namespace=public

# 应用名称
spring.application.name=springcloud-nacos-consumer
# 应用服务 WEB 访问端口
server.port=8082
# Nacos帮助文档: https://nacos.io/zh-cn/docs/concepts.html
# Nacos认证信息
spring.cloud.nacos.discovery.username=nacos
spring.cloud.nacos.discovery.password=nacos
# Nacos 服务发现与注册配置,其中子属性 server-addr 指定 Nacos 服务器主机和端口
spring.cloud.nacos.discovery.server-addr=xx.xxx.xxx.xx:8848
# 注册到 nacos 的指定 namespace,默认为 public
spring.cloud.nacos.discovery.namespace=public

安装zookeeper

一、下载

docker pull zookeeper

二、运行

docker run -p 2181:2181 -d zookeeper

三、进入容器

docker exec -it 容器id bash

安装 nacos(单机、mysql):

一、下载

docker pull nacos/nacos-server

二、挂载目录,用于映射到容器

mkdir -p /home/docker/nacos/logs/
mkdir -p /home/docker/nacos/init.d/

三、修改配置文件

vim /home/docker/nacos/init.d/custom.properties

内容如下:

server.contextPath=/nacos
server.servlet.contextPath=/nacos
server.port=8848

spring.datasource.platform=mysql
db.num=1
db.url.0=jdbc:mysql://localhost:3306/nacos_devtest_prod?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
db.user=user
db.password=pass

nacos.cmdb.dumpTaskInterval=3600
nacos.cmdb.eventTaskInterval=10
nacos.cmdb.labelTaskInterval=300
nacos.cmdb.loadDataAtStart=false
management.metrics.export.elastic.enabled=false
management.metrics.export.influx.enabled=false
server.tomcat.accesslog.enabled=true
server.tomcat.accesslog.pattern=%h %l %u %t "%r" %s %b %D %{User-Agent}i 
nacos.security.ignore.urls=/,/**/*.css,/**/*.js,/**/*.html,/**/*.map,/**/*.svg,/**/*.png,/**/*.ico,/console-fe/public/**,/v1/auth/login,/v1/console/health/**,/v1/cs/**,/v1/ns/**,/v1/cmdb/**,/actuator/**,/v1/console/server/**
nacos.naming.distro.taskDispatchThreadCount=1
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.expireInstance=true

四、执行sql语句

1、下载 
https://github.com/alibaba/nacos/blob/master/config/src/main/resources/META-INF/nacos-db.sql
2、在 mysql 中创建数据库,并且执行 sql 语句
3、修改配置文件信息

五、启动容器

docker run --name nacos -d -p 8848:8848 --privileged=true --restart=always -e JVM_XMS=256m -e JVM_XMX=256m -e MODE=standalone -e PREFER_HOST_MODE=hostname -v /home/docker/nacos/logs/ -v /home/docker/nacos/init.d/custom.properties:/home/nacos/init.d/custom.properties nacos/nacos-server

https://juejin.cn/post/7232959782281920567

加群联系作者vx:xiaoda0423

仓库地址:https://github.com/webVueBlog/JavaGuideInterview

猜你喜欢

转载自blog.csdn.net/qq_36232611/article/details/130939522