html网站的规划与建设,沈阳中小企业网站建设,电脑培训班速成班附近,搜狐广告收费标准前言
网上搜索docker中搭建nacos发现文章不是很好理解#xff0c;正好最近在搭建nacos练手。记录一下整个搭建过程。文章最后附上了一些过程中遇到的问题#xff0c;大家可以按需要查看。 docker中搭建nacos并将springboot项目的配置文件转移到nacos中 前言1 docker中下拉na…前言
网上搜索docker中搭建nacos发现文章不是很好理解正好最近在搭建nacos练手。记录一下整个搭建过程。文章最后附上了一些过程中遇到的问题大家可以按需要查看。 docker中搭建nacos并将springboot项目的配置文件转移到nacos中 前言1 docker中下拉nacos镜像2 配置nacos信息1. 创建docker的挂载目录实现数据的持久化2. 复制nacos默认配置文件到宿主机的挂载目录中删除容器 3 启动nacos4 配置nginx映射nacos配置后台5 配置nacos开启登录验证开始配置 6 配置数据库7 项目中配置nacosnacos配置数据库是mongdbmysql数据库项目 8 效果图其它问题vim问题nacos版本问题vim打开配置文件之后粘贴不进去初始化数据库权限认证失败新建命名空间失效 1 docker中下拉nacos镜像
下拉镜像这里不下拉也ok后面执行run的时候没有就自己去下拉了 docker pull nacos/nacos-server:v2.4.2 我本来下拉的时候没有加版本号也就是默认下拉了最新的但是启动报错说java版本不适配。所以这里指定了版本。
拉下来之后可以通过以下命令查询docker中的镜像 docker images 2 配置nacos信息
1. 创建docker的挂载目录实现数据的持久化
创建挂载目录 新建logs目录 mkdir -p /mydata/nacos/logs/ 新建conf目录 mkdir -p /mydata/nacos/conf/ 2. 复制nacos默认配置文件到宿主机的挂载目录中
因为需要使用到nacos中的默认配置文件如果直接将宿主机的目录挂载到docker容器中会导致宿主机的空目录覆盖容器原本的默认配置文件。因此 我们需要先不挂载目录启动一下容器将配置文件拷贝出来。然后再挂在启动容器。 否则会报如下错误找不到nacos-logback.xml文件。
启动容器 docker run -p 28848:8848 --name nacos -d nacos/nacos-server:v2.4.2 复制文件 cp nacos:/home/nacos/logs/ /mydata/nacos/ cp nacos:/home/nacos/conf/ /mydata/nacos/ 复制完可以在宿主机中查看目录中的东西如下已经存在上面报错找不到的nacos-logbask.xml文件 删除容器
刚刚创建的容器只是为了拷贝出默认的配置文件这里就需要把容器停止删除然后重新创建。 可以使用-f参数强制删除。如果不添加-f 则只能删除停止运行的容器 docker rm -f nacos 3 启动nacos
创建容器复制一下命令执行即可 docker run -d --name nacos -p 28848:8848 --privilegedtrue -e MODEstandalone -v /mydata/nacos/logs/:/home/nacos/logs -v /mydata/nacos/conf/:/home/nacos/conf/ --restartalways nacos/nacos-server:v2.4.2 参数解释 -d表示容器后台运行启动之后会返回一个容器id -p注意我这里使用了宿主机的28848端口 是将容器的8848端口映射到28848端口为什么不用宿主机的8848端口这样做主要是防止网络上的恶意攻击。 --privilegedtrue表示容器以特权模式运行表示容器可以执行一些通常受限的操作。 -e MODEstandalone表示nacos为单机模式运行默认是集群方式运行 参数为cluster。 -v 就是将容器里面两个重要的文件夹映射到我们宿主机上刚刚创建的两个文件夹中。方便我们操作管理。 --restart always 表示容器如果意外关闭docker会自动重启该容器。 nacos/nacos-server是指镜像名称就是我们第一步下拉下来的镜像名字。
启动完成之后可以查看一下docker容器的情况如下
4 配置nginx映射nacos配置后台
查找宿主机上的nginx.conf文件位置 find / -name nginx.conf 找到配置文件路径之后使用vim打开编辑 vim /你找到的路径/nginx.conf 在配置文件中添加以下配置信息
location ~ (^/nacos).* {proxy_pass http://127.0.0.1:28848;#proxy_set_header Host $host:$server_port;}
配置之后保存 检查配置文件格式是否正确 nginx -t 然后重启nginx sudo nginx -s reload 注意命令前加sudo 防止nginx重启的时候没有完全重启导致配置一直不生效。
sudo 以root权限执行此命令。因为nginx涉及到重要资源的配置如果端口443 8080。这些资源一般只有root用户或者设置的其它具备管理权限的用户才可以操作。因此防止启动不生效最好添加上。笔者之前因为不添加这个排查过很多次nginx启动了还不生效的问题很多时候是关闭没有关闭掉有启动了多个nginx。相互之间影响导致不生效
外网访问 输入你的域名或者ip /nacos 即可看到 如http://127.0.0.1:28848/nacos/
5 配置nacos开启登录验证
此时已经可以正常启动了 但是正常项目中一定是需要鉴权登录校验等的。所以下面通过配置application.properties文件开启登录验证
我在这一步遇到很多问题 启动之后如果大家也遇到问题可以进入到我们配置的log目录中查看具体的报错信息 tail -f /mydata/nacos/logs/nacos.log 配置大部分是操作application.properties 文件我这里附上一份我已经亲测好的配置文件。里面#中文提示的需要改成你的环境配置具体修改方法看下面操作步骤
# spring
server.servlet.contextPath${SERVER_SERVLET_CONTEXTPATH:/nacos}
server.contextPath/nacos
server.port${NACOS_APPLICATION_PORT:8848}
server.tomcat.accesslog.max-days30
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-messageALWAYS
# default current work dir
server.tomcat.basedirfile:.
#*************** 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.platformmysql
nacos.cmdb.dumpTaskInterval3600
nacos.cmdb.eventTaskInterval10
nacos.cmdb.labelTaskInterval300
nacos.cmdb.loadDataAtStartfalsedb.num${MYSQL_DATABASE_NUM:1}
# 数据库的连接************************************************************************
db.url.0jdbc:mysql://你的ip地址:23306/nacos_config?characterEncodingutf8connectTimeout1000socketTimeout3000autoReconnecttrue
# 数据库的账号************************************************************************
db.user.0heibaike
# 数据库的密码************************************************************************
db.password.0password# db.url.0jdbc:mysql://${MYSQL_SERVICE_HOST}:${MYSQL_SERVICE_PORT:3306}/${MYSQL_SERVICE_DB_NAME}?${MYSQL_SERVICE_DB_PARAM:characterEncodingutf8connectTimeout1000socketTimeout3000autoReconnecttrueuseSSLfalse}
# db.user.0${MYSQL_SERVICE_USER}
# db.password.0${MYSQL_SERVICE_PASSWORD}
## DB connection pool settings
db.pool.config.connectionTimeout${DB_POOL_CONNECTION_TIMEOUT:30000}
db.pool.config.validationTimeout10000
db.pool.config.maximumPoolSize20
db.pool.config.minimumIdle2
### 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.typenacos
### The token expiration in seconds:
nacos.core.auth.plugin.nacos.token.expire.seconds${NACOS_AUTH_TOKEN_EXPIRE_SECONDS:18000}
### The default token:
# 你生成的的base64密钥************************************************************************
nacos.core.auth.plugin.nacos.token.secret.key${NACOS_AUTH_TOKEN:PQdq6s7A13******zJKcok1yyvBnSuELY}
### 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.caching.enabled${NACOS_AUTH_CACHE_ENABLE:false}
nacos.core.auth.enable.userAgentAuthWhite${NACOS_AUTH_USER_AGENT_AUTH_WHITE_ENABLE:false}
# 服务端认证需要的key************************************************************************
nacos.core.auth.server.identity.key${NACOS_AUTH_IDENTITY_KEY:liulu}
# 服务端认证需要的value************************************************************************
nacos.core.auth.server.identity.value${NACOS_AUTH_IDENTITY_VALUE:liulu}
# 开启鉴权************************************************************************
nacos.core.auth.enabledtrue
# 你自定义的用户名************************************************************************
cos.core.auth.usernameusername
# 你自定义的密码************************************************************************
nacos.core.auth.passwordpassword## spring security config
### turn off security
nacos.security.ignore.urls${NACOS_SECURITY_IGNORE_URLS:/,/error,/**/*.css,/**/*.js,/**/*.html,/**/*.map,/**/*.svg,/**/*.png,/**/*.ico,/console-fe/public/**,/v1/auth/**,/v1/console/health/**,/actuator/**,/v1/console/server/**}
# metrics for elastic search
management.metrics.export.elastic.enabledfalse
management.metrics.export.influx.enabledfalse
nacos.naming.distro.taskDispatchThreadCount10
nacos.naming.distro.taskDispatchPeriod200
nacos.naming.distro.batchSyncKeyCount1000
nacos.naming.distro.initDataRatio0.9
nacos.naming.distro.syncRetryDelay5000
nacos.naming.data.warmuptrue
nacos.console.ui.enabledtrue
nacos.core.param.check.enabledtrue
开始配置
我在配置文件application.properties 中开启鉴权 nacos.core.auth.enabledtrue 之后重启镜像报错说没有生成合适的token
然后我又在配置文件中修改了 nacos.core.auth.plugin.nacos.token.secret.keyyoUNZzcOU/x/0T**********He3tJgq1oVobClEvdUg 这个值需要大家自己生成一个合适的Base64编码密钥,可以通过一下方法生成
import java.util.Base64;public class Main {public static void main(String[] args) {String secret your-32-byte-long-secret-key;String base64Encoded Base64.getEncoder().encodeToString(secret.getBytes());System.out.println(base64Encoded);}
}
运行上述代码并将输出的 Base64 编码密钥放入配置文件中。 然后重启镜像说没有nacos.core.auth.server.identity.key 3. 配置nacos.core.auth.server.identity.key 默认的如下 nacos.core.auth.server.identity.key${NACOS_AUTH_IDENTITY_KEY:} nacos.core.auth.server.identity.value${NACOS_AUTH_IDENTITY_VALUE:} 这里只需要在参数中:后面自定义值就可以如下 nacos.core.auth.server.identity.key${NACOS_AUTH_IDENTITY_KEY:heibaike} nacos.core.auth.server.identity.value${NACOS_AUTH_IDENTITY_VALUE:wanghaixin} 然后保存文件 重启docker容器 docker restart nacos 搞定 6 配置数据库
之前已经正常运行起来但是数据库使用的是nacos内置的数据库可能会有数据丢失的风险这里演示如何使用外部数据库
我使用的是mysql数据库这里演示数据库配置
在数据库中创建数据库nacos_config 然后在数据库中执行 /mydata/nacos/conf/ 目录中的mysql-schema.sql和 1.4.0-ipv6_support-update.sqlsql文件生成初始数据库。
然后编辑 /mydata/nacos/conf/ 目录中application.properties
db.url.0jdbc:mysql://182.***.72:3306/nacos_config?useUnicodetruecharacterEncodingutf8zeroDateTimeBehaviorconvertToNulluseSSLtrueserverTimezoneGMT%2B8allowMultiQueriestrue
db.user.0root
db.password.0123456如上设置自己的账号密码注意如果是在mysql服务在同一个电脑上不可以使用127.0.0.1或者localhost。 因为在docker容器中127.0.0.1或者localhost代表的是容器本身的网络而不是宿主机的网络因此这里使用宿主机的真实ip
配置完成之后重启dockers容器 docker restart nacos 这块我配置的过程中不知道哪里写错了还是怎的我猜测是因为向服务器上面复制的时候意外粘贴到了vim的命令行中触发了某些参数导致我复制的时候复制不进去并且会改文件中的文件导致怎么都运行不起来了。如果大家也遇到看不出来的问题也通过复制上面完整的配置文件放到本地重新赋值里面的环境再把配置文件上传到服务器上解决问题
7 项目中配置nacos
nacos配置
nacos配置中创建命名空间 点击命名空间 创建配置
数据库是mongdb
项目中 引入pom依赖 !--bootstrap--dependencygroupIdorg.webjars/groupIdartifactIdbootstrap/artifactIdversion3.3.5/version/dependency!--nacos配置--dependencygroupIdcom.alibaba.cloud/groupIdartifactIdspring-cloud-starter-alibaba-nacos-config/artifactIdversion2.2.6.RELEASE/version/dependency
resources目录下新建 bootstrap.yml
spring:application:# 确保这个与 Nacos 中的 Data ID 前缀保持一致name: application.ymlcloud:nacos:config:# Nacos 服务器地址server-addr: 39.99.$$.$$1:28848# 配置文件的格式file-extension: yaml# Nacos 中的 group 名称group: USER_GROUP# Nacos 中的 group 名称namespace: 01af5f95-0##2-##f1-ab99-b###bb6b082注释掉原来的配置文件如application.yml 启动运行 搞定
mysql数据库项目
pom.xml中引入依赖 !--bootstrap--dependencygroupIdorg.webjars/groupIdartifactIdbootstrap/artifactIdversion3.3.5/version/dependency!--nacos配置--dependencygroupIdcom.alibaba.cloud/groupIdartifactIdspring-cloud-starter-alibaba-nacos-config/artifactIdversion2.2.6.RELEASE/version/dependency!-- 引入阿里数据库连接池 --dependencygroupIdcom.alibaba/groupIdartifactIddruid/artifactIdversion1.1.6/version/dependency
引入配置文件bootstrap.yml
spring:application:name: springboot-nacosprofiles:active: devcloud:nacos:config:# 配置中心的地址server-addr: 127.**.0.**:8848# 配置文件prefixprefix: application.yaml# 配置文件的格式file-extension: yaml# 配置文件的环境group: USER_GROUP# 命名空间namespace: d88e-13%%d-47#b-b42e-cdc##2501273引入配置文件DruidDataSourceWrapper
package cn.wanghaixin.solution.config;import com.alibaba.druid.pool.DruidDataSource;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.context.annotation.Configuration;Configuration
RefreshScope
public class DruidDataSourceWrapper extends DruidDataSource implements InitializingBean {
//这个对应这nacos配置的yaml中的数据库路径Value(${spring.datasource.url})private String url;Value(${spring.datasource.username})private String username;Value(${spring.datasource.password})private String password;Value(${spring.datasource.driver-class-name})private String driverClassName;private String passwordCallbackClassName;public void setMaxWait(int maxWait) {this.maxWait maxWait;}public void setTimeBetweenEvictionRunsMillis(long timeBetweenEvictionRunsMillis) {this.timeBetweenEvictionRunsMillis timeBetweenEvictionRunsMillis;}public void setMinEvictableIdleTimeMillis(long minEvictableIdleTimeMillis) {this.minEvictableIdleTimeMillis minEvictableIdleTimeMillis;}Overridepublic void setUrl(String url) {this.url url;}Overridepublic void setDriverClassName(String driverClassName) {this.driverClassName driverClassName;}Overridepublic void setPasswordCallbackClassName(String passwordCallbackClassName) {this.passwordCallbackClassName passwordCallbackClassName;}Overridepublic void afterPropertiesSet() throws Exception {// 如果未找到前缀“spring.datasource.druid”JDBC属性将使用“Spring.DataSource”前缀JDBC属性。super.setUrl(url);super.setUsername(username);super.setPassword(password);super.setDriverClassName(driverClassName);super.setInitialSize(initialSize);super.setMinIdle(minIdle);super.setMaxActive(maxActive);super.setMaxWait(maxWait);super.setTimeBetweenEvictionRunsMillis(timeBetweenEvictionRunsMillis);super.setMinEvictableIdleTimeMillis(minEvictableIdleTimeMillis);super.setValidationQuery(validationQuery);super.setTestWhileIdle(testWhileIdle);super.setTestOnBorrow(testOnBorrow);super.setTestOnReturn(testOnReturn);super.setPoolPreparedStatements(poolPreparedStatements);super.setMaxPoolPreparedStatementPerConnectionSize(maxPoolPreparedStatementPerConnectionSize);super.setDbType(dbType);super.setPasswordCallbackClassName(passwordCallbackClassName);}
}
创建配置文件NacosConfigConfiguration
package cn.wanghaixin.solution.config;import com.alibaba.druid.pool.DruidDataSource;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;EnableAutoConfiguration
Configuration
public class NacosConfigConfiguration {Bean(initMethod init)ConditionalOnMissingBeanRefreshScopepublic DruidDataSource dataSource() {return new DruidDataSourceWrapper();}
}
注释掉原来的配置文件
8 效果图 其它问题
vim问题
可能是我在复制信息的时候意外在命令模式输入了导致我继续再编辑模式复制时复制不上并且会改变文件中原本有的内容。 尝试了很多方法都没有解决为了进度我暂时通过其它方式达到了目的。但是这个问题没有解决 有知道的小伙伴可以留言还请赐教
nacos版本问题
我最开始下拉镜像的时候是直接下拉了官方最新的 docker pull nacos/nacos-server 运行竟然报一下错误,搜索了一下这个方法是java
vim打开配置文件之后粘贴不进去
我使用的是xshell 比如我复制了数据库的url粘贴到vim打开的文本时光标在文本中进行了跳动并没有粘贴进去我指定的内容。
问题原因vim的自动缩进造成的
解决方法 使用 :set paste命令 进入 Vim 后输入 :set paste 并回车。 然后按 i 进入插入模式尝试右键粘贴文本。 粘贴完成后输入 :set nopaste 回到正常模式。 然后i 进入输入模式然后粘贴即可
初始化数据库
报错 Invalid default value for ‘gmt_create’
在5.6.5之后的版本才能使用CURRENT_TIMESTAMP作为DATETIME的默认值但是当前MySQL数据库的版本为5.5CURRENT_TIMESTAMP只能作为TIMESTAMP的默认值。
可以通过一下命令查看数据库版本进一步确定问题 SELECT VERSION(); 解决方法
将datetime类型改为timestamp类型即可。去掉DEFAULT CURRENT_TIMESTAMP即可。
权限认证失败
首次登录提示 权限认证失败 没有 命名空间的访问权限
不用管哈哈 。重新登陆就没有了
新建命名空间失效
配置文件中指定初始化数据库类型的位置 spring.sql.init.platform${SPRING_DATASOURCE_PLATFORM:} 显示调整为mysql spring.sql.init.platformmysql