目录
2.3、 编辑yml文件--把application改为bootstrap优先级更高
3.2、创建ProviderCacheController类
1、 模拟服务器与浏览器进行交互
1.1、 创建Tomcat和browser类
Tomcat:模拟Tomcat,基于java中的网络编程实现(java.net)
网络服务端 serversocket 网络客户端 socket
Browser:模拟浏览器client
1.2、 编辑Tomcat类
package com.jt.common.net;
import java.io.IOException;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class Tomcat {
public static void main(String[] args) throws IOException {
// 创建服务 并在port进行监听
// 网络中计算机的唯一标识是什么?id
// 计算机中app的唯一标识是什么?port
ServerSocket server =new ServerSocket(9999);
System.out.println("server start ******");
// 启动服务监听
while (true){
// 监听客户端的链接(这里的socket代码客户端对象)
Socket socket=server.accept();//阻塞方法
// 可以将socket对象的信息记录一下(服务注册)
System.out.println("连接已建立");
// 在服务端创建 输出 流对象 向客户端输出hello client 然后客户端得去读数据
OutputStream out =socket.getOutputStream();
byte[] responseContent=("HTTP/1.1 200 ok \r\n" +
"Content-Type :text/html;charset=utf-8 \r\n"+"\r\n"
+ "<h2>helloclient</h2>").getBytes();
out.write(responseContent);
// out.write("helloclient".getBytes());
out.flush();
}
}
}
1.3、 编辑Browser类
package com.jt.common.net;
import java.io.IOException;
import java.io.InputStream;
import java.net.Socket;
//模拟浏览器client
public class Browser {
public static void main(String[] args) throws IOException {
// 创建网络编程中的客户端对象socket
// 构建socket对象时 要执行连接的计算机ip 访问计算机中的哪个应用port
Socket socket=new Socket("127.0.0.1",9999);
// 创建输入流对象,读取服务端写到客户端的数据
InputStream in =socket.getInputStream();
byte[] buf=new byte[1024];
int len =in.read(buf);
String content =new String(buf,0,len);
System.out.println(content);
// 释放资源
in.close();
}
}
1.4、 效果展示
2、 完成配置中心
2.1、创建ProviderLogController类
基于controller演示配置中心的作用,在这个controller中我们基于日志对象进行日志传输测试
package com.jt.provider.controller;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RefreshScope//告诉系统底层,配置中心内容发生变化,重新构建此对象
public class ProviderLogController {
//创建一个日志对象 Log4j=> Log facade for java
//java中的日志API规范 基于这个规范有Log4j,Logback等
//log对象在哪个类中创建,getLogger方法中就传入哪个类的字节码对象
//以后只有java中使用日志对象,你就采用下面的方式创建即可
//@Slf4j如果类上使用了这个注解 log对象就不需要手动创建,lombok会帮我们创建
private static final Logger log =
LoggerFactory.getLogger(ProviderLogController.class);
@GetMapping("/provider/log/doLog01")//当前项目默认级别是info
public String doLog01(){// trace<debug<info<warn<error
log.trace("==log.trace==");//跟踪
log.debug("==log.debug==");//测试
log.info("==log.info==");//常规信息
log.warn("==log.warn==");//警告
log.error("==log.error==");//错误信息
return "log config test";
}
public ProviderLogController(){
System.out.println("==ProviderLogController()==");
}
/**
* 请问这个配置何时读取?logLevel属性初始化时.
* 请问logLevel属性何时初始化呢?对象构建时
* 假如希望logLevel属性值,与配置中心这个配置的值始终是同步的怎么办?
* 只要修改配置中心的内容,就重新重建对象,然后属性会重新初始化.
*/
@Value("${logging.level.com.jt}")
private String logLevel;
@GetMapping("/provider/log/doLog02")
public String doLog02(){
log.info("log.level is {}",logLevel);//这里的{}表示占位符
return "log level is "+logLevel;
}
}
2.2、 添加pom.xml文件的依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
2.3、 编辑yml文件--把application改为bootstrap优先级更高
server:
port: 8082
spring:
application:
name: sca-provider
cloud:
nacos:
discovery:
server-addr: localhost:8848
config:
server-addr: localhost:8848
file-extension: yml
# group: DEFAULT_GROUP_51
namespace: 3e4ba0ef-0d80-4ead-9608-46c3303f2316
shared-configs[0]:
data-id: app-public.yml
refresh: true #默认false,共享配置更新,引用此配置的地方是否要更新
2.4、 idea连接数据库
打开idea的右侧database,点击 +
数据库URL:
jdbc:mysql://localhost:3306/nacos_config?
severTimezone=Asia/Shanghai&characterEncoding=utf8
点击测试连接成功之后,apply 后点击ok即可
点击数据库名后面的三个点,勾选想要的表,然后点击空白页面即可出来。
2.5、 nacos新增配置
点击 + 号进入新增配置
填写DATA ID、配置格式和配置内容
发布确认之后
2.6、 重启服务器,刷新属性日志页面
sca-provider.yml配置信息导入数据库
3、命名空间模式设计
3.1、新增新的命名空间dev
dev:为了完成不关闭服务器的情况下进行配置更新
进行克隆sca-provider.yml
新增分组配置sca-provider.yml,分组为_51
3.2、创建ProviderCacheController类
package com.jt.provider.controller;
import jdk.nashorn.internal.ir.CatchNode;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
//获取和输出DEV_GROUP_51配置中设置的线程数
//基于controller测试是否启用本地缓存的配置(这个配置从配置中心读取)
@RefreshScope
@RestController
public class ProviderCacheController {
@Value("${useLocalCache:false}")
private boolean useLocalCache;
@RequestMapping("/provider/cache")
public String doUseLocalCache(){
return "useLocalCache'value is "+useLocalCache;
}
@RequestMapping("/provider/cache01")
public List<String> doUseLocalCache01(){
return Arrays.asList("A","B","C");
}
//构建一个本地缓存local缓存对象(基于jvm的一个对象存储从数据库获取),用于构建
private List<String> cache =new ArrayList<>();
@RequestMapping("/provider/cache02")
public List<String> doUseLocalCache02(){
if(cache.isEmpty()){
System.out.println("******************get data from databases************");
List<String> cates=Arrays.asList("aaa","bbb","ccc");
cache.addAll(cates);
}
return cache;
}
}
3.3、 在yml文件中进行修改,添加dev的命名空间ID
spring:
cloud:
nacos:
config:
namespace: 3e4ba0ef-0d80-4ead-9608-46c3303f2316
group: DEFAULT_GROUP_51
刷新制定的服务 localhost:8082/provider/cache 进行访问
3.4、把yml文件的分组关闭 启用共享配置
server:
port: 8082
spring:
application:
name: sca-provider
cloud:
nacos:
discovery:
server-addr: localhost:8848
config:
server-addr: localhost:8848
file-extension: yml
# group: DEFAULT_GROUP_51
namespace: 3e4ba0ef-0d80-4ead-9608-46c3303f2316
shared-configs[0]:
data-id: app-public.yml
refresh: true #默认false,共享配置更新,引用此配置的地方是否要更新
#日志调级
#麻烦:需要重启服务器 耽误项目上线等问题会出现
#所以可以写到配置中心可进行动态日志调级
#配置com.jt包以及子包中的日志级别
#logging:
# level:
# com.jt: debug
3.5、执行刷新方法的效果
3.5.1、刷新cache01
localhost:8082/provider/cache01
3.5.2、刷新cache02
localhost:8082/provider/cache02