微服务配置中心--CureGuy

本文介绍了如何使用Spring Cloud Alibaba Nacos作为配置中心,包括模拟服务器与浏览器交互,创建ProviderLogController进行日志测试,配置Nacos连接数据库,创建命名空间dev并实现动态配置更新。通过ProviderCacheController展示了命名空间模式下配置的使用和刷新效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

1、 模拟服务器与浏览器进行交互

1.1、 创建Tomcat和browser类

1.2、 编辑Tomcat类

1.3、 编辑Browser类

1.4、 效果展示

2、 完成配置中心

2.1、创建ProviderLogController类

2.2、 添加pom.xml文件的依赖

2.3、 编辑yml文件--把application改为bootstrap优先级更高

2.4、 idea连接数据库

2.5、 nacos新增配置

2.6、 重启服务器,刷新属性日志页面

3、命名空间模式设计

3.1、新增新的命名空间dev

3.2、创建ProviderCacheController类

3.3、 在yml文件中进行修改,添加dev的命名空间ID

 3.4、把yml文件的分组关闭 启用共享配置

3.5、执行刷新方法的效果

3.5.1、刷新cache01

3.5.2、刷新cache02


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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值