一、安装Nacos
1、Nacos下载地址
官网:https://github.com/alibaba/Nacos/releases
百度云盘(tar.gz):链接: https://pan.baidu.com/s/1xI8rOgvCX37oiZT7oHYZ7A 密码: btvq
linux 下载: latest stable release
windows下载 : latest stable release
![](https://img.haomeiwen.com/i10861568/51ef85a98f38a512.png)
2、解压并进入nacos的bin目录
2.1、解压
正常情况下下载会自动解压,如未解压,可用命令:tar -zxvf nacos-server-1.2.1.tar.gz
2.2、进入nacos的bin目录
dsMacBook-Pro:alibaba ds$ cd /usr/local/
dsMacBook-Pro:alibaba ds$ sudo mkdir alibaba
dsMacBook-Pro:alibaba ds$ sudo chmod 777 /usr/local/alibaba
dsMacBook-Pro:alibaba ds$ mv /Users/ds/Downloads/nacos /usr/local/alibaba/
dsMacBook-Pro:alibaba ds$ cd nacos/bin/
# 进入到nacos的bin目录
dsMacBook-Pro:bin ds$ ls
shutdown.cmd shutdown.sh startup.cmd startup.sh
3、启动单机 + 关闭nacos
# 启动单机
dsMacBook-Pro:bin ds$ sh startup.sh -m standalone
/Library/Java/JavaVirtualMachines/jdk1.8.0_201.jdk/Contents/Home/bin/java -Djava.ext.dirs=/Library/Java/JavaVirtualMachines/jdk1.8.0_201.jdk/Contents/Home/jre/lib/ext:/Library/Java/JavaVirtualMachines/jdk1.8.0_201.jdk/Contents/Home/lib/ext -Xms512m -Xmx512m -Xmn256m -Dnacos.standalone=true -Dnacos.member.list= -Xloggc:/usr/local/alibaba/nacos/logs/nacos_gc.log -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCTimeStamps -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=10 -XX:GCLogFileSize=100M -Dloader.path=/usr/local/alibaba/nacos/plugins,/usr/local/alibaba/nacos/plugins/health,/usr/local/alibaba/nacos/plugins/cmdb,/usr/local/alibaba/nacos/plugins/selector -Dnacos.home=/usr/local/alibaba/nacos -jar /usr/local/alibaba/nacos/target/nacos-server.jar --spring.config.additional-location=file:/usr/local/alibaba/nacos/conf/ --logging.config=/usr/local/alibaba/nacos/conf/nacos-logback.xml --server.max-http-header-size=524288
nacos is starting with standalone
nacos is starting,you can check the /usr/local/alibaba/nacos/logs/start.out
# 关闭nacos
dsMacBook-Pro:bin ds$ sh shutdown.sh
The nacosServer(13369) is running...
Send shutdown request to nacosServer(13369) OK
4、检查nacos启动的端口
dsMacBook-Pro:logs ds$ lsof -i:8848
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
java 13369 ds 277u IPv6 0x45392a576f7f5777 0t0 TCP *:8848 (LISTEN)
5、访问nacos的服务端
5.1、访问地址:http://127.0.0.1:8848/nacos/index.html
![](https://img.haomeiwen.com/i10861568/f3a225a3b01be712.png)
6、验证服务器
6.1、服务注册
dsMacBook-Pro:bin ds$ curl -X POST 'http://127.0.0.1:8848/nacos/v1/ns/instance?serviceName=nacos.naming.serviceName&ip=20.18.7.10&port=8080'
6.2、服务发现
dsMacBook-Pro:bin ds$ curl -X GET 'http://127.0.0.1:8848/nacos/v1/ns/instance/list?serviceName=nacos.naming.serviceName'
{"name":"DEFAULT_GROUP@@nacos.naming.serviceName","groupName":"DEFAULT_GROUP","clusters":"","cacheMillis":10000,"hosts":[],"lastRefTime":1689242213419,"checksum":"","allIPs":false,"reachProtectionThreshold":false,"valid":true}
![](https://img.haomeiwen.com/i10861568/0d27ea3fb997ebf0.png)
7、新建命名空间
![](https://img.haomeiwen.com/i10861568/3b233cc45544fa06.png)
![](https://img.haomeiwen.com/i10861568/f9703b7175ca4710.png)
二、engine 业务处理子模块创建
1、右键项目 - New - Module
![](https://img.haomeiwen.com/i10861568/271619295e61e6e4.png)
2.1、bootstrap.yml
server:
port: 8001 # 端口
servlet:
# server.servlet.context-path 1)不配置时,默认为 / , 例:localhost:8080/xxx ,2)配置时 /demo localhost:8080/demo/xxx
context-path:
tomcat:
uri-encoding: utf-8 # 编码格式 utf-8
spring:
application:
name: engine #唯一名称
profiles:
active: dev # 运行环境
freemarker:
check-template-location: false # 检查模板位置是否存在
prefer-file-system-access: false # 加载模板时首选文件系统访问权限。文件系统访问允许对模板更改进行热检测
mybatis:
mapper-locations: classpath:mapping/*/*.xml
logging: # logback 配置
path: /usr/local/alibaba/logs/${spring.application.name} # 保存日志文件目录路径
level: # 日志级别
org.springframework.web: DEBUG # 配置spring web日志级别
2.2、bootstrap-dev.yml
spring:
cloud:
nacos:
discovery:
# 这里配你的本地IP
server-addr: 192.168.0.119:8848 # nacos的访问地址,根据上面准备工作中启动的实例配置
namespace: 11ba48cc-9931-4760-bf58-7d3e2c99629c # Nacos dev命名空间的ID # Nacos命名空间ID
config:
server-addr: 192.168.0.119:8848 # nacos的访问地址,根据上面准备工作中启动的实例配置
namespace: 11ba48cc-9931-4760-bf58-7d3e2c99629c # Nacos dev命名空间的ID # Nacos命名空间ID
group: DEFAULT_GROUP # 默认分组就是DEFAULT_GROUP,如果使用默认分组可以不配置
file-extension: yml # 默认properties
3、pom.xml
<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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.aydan</groupId>
<artifactId>ali-cloud</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<artifactId>engine</artifactId>
<packaging>jar</packaging>
<name>engine</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<!--集成公共模块-->
<dependency>
<groupId>com.aydan</groupId>
<artifactId>common</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
<!--nacos service discovery client依赖-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!--nacos config client 依赖-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<!--spring cloud+dubbo 依赖-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-dubbo</artifactId>
</dependency>
<!--redis-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
4、创建配置
![](https://img.haomeiwen.com/i10861568/793fbe3edcbd3822.png)
![](https://img.haomeiwen.com/i10861568/0a45de9aa4c38be7.png)
![](https://img.haomeiwen.com/i10861568/7eb24726262a426f.png)
5、engine-dev.yml
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://*.*.*.*:3306/sa_test?useUnicode=true&characterEncoding=utf-8&useSSL=false&allowMultiQueries=true&serverTimezone=Asia/Shanghai&rewriteBatchedStatements=true
username: root
password: deepchain@20190115
druid:
initialSize: 100
minIdle: 100
maxActive: 300
maxWait: 50000
redis:
database:
host: *.*.*.*
port: 6379
password: *********
timeout: 5000
dubbo:
consumer:
timeout: 36000
scan:
# dubbo 服务扫描基准包
base-packages: com.aydan
protocol:
# dubbo 协议
name: dubbo
# 配置本机内网地址
host: 127.0.0.1
# dubbo 协议端口( -1 表示自增端口,从 20880 开始)
port: -1
dubbo:
# 当dubbo服务提供层向消费层传输大数据容量的对象时,会受到Dubbo的限制。默认为8M,修改为800M
payload: 838860800
registry:
# 挂载到 Spring Cloud 的注册中心
address: spring-cloud://localhost
rocketmq:
name-server: 192.168.0.119:9876
producer:
# 小坑:必须指定group
group: ali-group
# common 模块中的代码
package com.aydan.utils;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;
@Component
public class SpringUtils implements ApplicationContextAware {
/**
* 上下文对象实例
*/
private static ApplicationContext applicationContext;
/**
* 获取applicationContext
*
* @return
*/
public static ApplicationContext getApplicationContext() {
return applicationContext;
}
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
this.applicationContext = applicationContext;
}
/**
* 通过name获取 Bean.
*
* @param name
* @return
*/
public static Object getBean(String name) {
return getApplicationContext().getBean(name);
}
/**
* 通过class获取Bean.
*
* @param clazz
* @param <T>
* @return
*/
public static <T> T getBean(Class<T> clazz) {
return getApplicationContext().getBean(clazz);
}
/**
* 通过name,以及Clazz返回指定的Bean
*
* @param name
* @param clazz
* @param <T>
* @return
*/
public static <T> T getBean(String name, Class<T> clazz) {
return getApplicationContext().getBean(name, clazz);
}
}
6、EngineApplication.java
package com.aydan;
import com.aydan.utils.SpringUtils;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.core.env.Environment;
import javax.annotation.PostConstruct;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.TimeZone;
/**
* @Author ds
* @Date 2023/7/24
*/
@SpringBootApplication
@EnableDiscoveryClient
public class EngineApplication {
public static void main(String[] args) {
TimeZone.setDefault(TimeZone.getTimeZone("Asia/Shanghai"));
// SpringApplication.run(MasterApplication.class, args);
ConfigurableApplicationContext application = SpringApplication.run(EngineApplication.class, args);
Environment environment = application.getEnvironment();
String applicationName = environment.getProperty("spring.application.name");
String port = environment.getProperty("server.port");
String contextPath = environment.getProperty("server.servlet.context-path");
System.out.println("---------------------------------------------------------->");
System.out.println(" :: ServletInitializer 启动:" + applicationName);
String localHost;
try {
localHost = InetAddress.getLocalHost().getHostAddress();
System.out.println("\t\t http://" + localHost + ":" + port + "" + contextPath + "");
} catch (UnknownHostException e) {
System.out.println("\t\t " + e.getMessage());
e.printStackTrace();
}
System.out.println("<----------------------------------------------------------");
}
@PostConstruct
void setDefaultTimezone() {
TimeZone.setDefault(TimeZone.getTimeZone("Asia/Shanghai"));
}
@Bean
public SpringUtils springUtils() {
return new SpringUtils();
}
}
# common 模块中的代码 (可忽略)
package com.aydan.business.service;
public interface CfgService {
String getEnvironment();
/**
* 取配置信息
*
* @param pkey
* @return
*/
String getValue(String pkey);
/**
* 返回系统临时目录
* @return
*/
String getTmpDir();
}
7、CfgServiceImpl.java (可忽略)
/**
* @title CfgServiceImpl
* @description
*/
package com.aydan.service.impl;
import com.aydan.business.dao.PlCfgDao;
import com.aydan.business.entity.PlCfgEntity;
import com.aydan.business.service.CfgService;
import com.aydan.utils.ValidateUtils;
import org.apache.dubbo.config.annotation.DubboService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.data.redis.core.StringRedisTemplate;
import javax.annotation.Resource;
import java.util.concurrent.TimeUnit;
/**
* @author ds
* @version V1.0
* @description
*/
@DubboService
public class CfgServiceImpl implements CfgService {
private Logger logger = LoggerFactory.getLogger(getClass());
/**
* 当前环境
*/
@Value("${spring.profiles.active}")
private String environment;
@Resource
private StringRedisTemplate stringRedisTemplate;
@Resource
protected PlCfgDao plCfgDao;
/**
* 取当前环境
*
* @return
*/
public String getEnvironment() {
return environment;
}
/**
* 取配置信息
* 配置信息将通过redis进行缓存,有效期24小时
*
* @param pkey
* @return
*/
public String getValue(String pkey) {
String key = "cfg_" + environment + "_" + pkey;
String val = "";
// 生产环境对值进行24小时缓存,其他环境不缓存
if (environment.equals("prd")) {
val = stringRedisTemplate.opsForValue().get(key);
}
// 如果未通过redis取得配置信息
if (ValidateUtils.isNull(val)) {
// 取某一环境类型下某一 key 对应的值
PlCfgEntity cfgEntity = plCfgDao.getCfgEntity(pkey, environment);
if (cfgEntity == null) {
logger.error("取配置信息出错,未到到{}环境中的{}的值", environment, pkey);
} else {
val = cfgEntity.getPvalue();
logger.info("pkey : " + pkey);
logger.info("key : " + key);
logger.info("val : " + val);
try {
stringRedisTemplate.opsForValue().set(key, val, 3600 * 24, TimeUnit.SECONDS); //有效期24小时
} catch (Exception e) {
logger.error("将值保存到Redis中出错(key={}, val={}):" + e.getMessage(), key, val);
}
}
}
return val;
}
/**
* 返回系统临时目录
*
* @return
*/
@Override
public String getTmpDir() {
return getValue("pl_tmp_dir");
}
}
![](https://img.haomeiwen.com/i10861568/7d162100a4e1a7f4.png)
网友评论