2021-10-26

服务启动与访问

第一步:启动Nacos服务。

Linux/Unix/Mac启动命令(standalone代表着单机模式运行,非集群模式):

./startup.sh -m standalone

Windows启动命令(standalone代表着单机模式运行,非集群模式):

startup.cmd -m standalone

yml文件和配置中心如果不存在logging.level.com.cy

yml文件是读取了存入Map集合中,@Value("${logging.level.com.cy:debug}")注解如果读取不到配置中心和配置文件需要给默认值,冒号后面那个。

server:
  port: 8082
spring:
  application:
    name: sca-provider
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848 #nacos在一台电脑可以不配置
      config:
        server-addr: localhost:8848 #配置地址
        file-extension: yml #定义配置中心配置的格式
        namespace: 3a5fe565-1aa9-41d0-bd3c-e4da7cf27ac0  # 默认命名空间为public
        #group: DEFAULT_GROUP_51
        shared-configs[0]:    #这是配置共享配置文件的配置
                data-id: app-public.yml # 这个名字为nacos中指定命名空间的data id
                refresh: true #配置中心内容发生变化,是否动态刷新
logging:
  level:
    com.cy: debug #配置com.cy包的日志级别

下面代码用到了双重校验,很重要

package com.cy.provider.Controller;

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;
import java.util.concurrent.CopyOnWriteArrayList;

/**
 * 测试配置分组
 */
@RestController
@RefreshScope
public class ProviderCacheController {
    @Value("${useLocalCache:false}")//这是设置了默认值,false,防止检查不到yml配置文件或者nacos配置中心报错
    private boolean useLocalCache;

    @RequestMapping("/provider/cache")
    public String doUseLocalCache(){
        return "useLocalCache'value is   "+useLocalCache;
    }
    //构建一个本地(local)缓存对象(基于jvm中的一个对象)
    private List<String> list = new CopyOnWriteArrayList<>();
    @RequestMapping("/provider/cache02")
    public List<String> doUseLocalCache02(){
        //假设这部分信息分类信息是从数据库是从数据库获取
        if (!useLocalCache){//如果开启了就不走下面了直接return
            System.out.println("++++++++++get data from database");
            return Arrays.asList("A", "B", "C");
        }
        if (!useLocalCache) {
            synchronized (list) {
                if (list.isEmpty()) {
                    System.out.println("++++++++++get data from database");
                    List<String> list2 = Arrays.asList("A", "B", "C");
                    list.addAll(list2);
                }
            }
        }
        return list;
    }

}
package com.cy;

import java.util.Timer;
import java.util.TimerTask;

/**
 * 单线程任务调度
 */

public class TimerUtils {
    public static void main(String[] args) {
        //1.构建执行任务的对象
        Timer timer = new Timer();//Timer创建时会创建一个线程,并且会为线程分配一个队列,所以他是单线程的
        //2.构建任务对象
     TimerTask task1 = new TimerTask() {
            @Override
            public void run() {
                System.out.println(System.currentTimeMillis());
                timer.cancel();//终结任务调度
            }
        };
        //3.定时执行任务
        timer.schedule(task1,//要执行的任务
                30000,//1秒以后开始执行
                30000);//每隔一秒执行一次
        //基于Timer类执行定时是任务时,最大的缺陷是多个任务不能并发执行

    }
}

Day05~Nacos配置管理模型

核心知识点

配置管理模型存在的意义

配置管理模型三要素及其要素关系
Nacos中读取指定命名空间和分组下的配置
Naocs中的共享配置的设计(对很多配置文件中的共性的一种提取方式)
常见问题分析
如何理解配置的命名空间(Namesapce)?(定义一些配置的作用域,做配置的分类管理,不同环境不同配置)
为什么要进行配置分组?(一个命名空间可以有多个分组,同一个生产环境下的不同活动会有不同配置)
配置中心运行有共享配置吗,如何引用?(可以,基于shared-configs元素进行引用)
Java程序中读取不到配置?(依赖,配置文件,命名空间,分组,data-id,空格,缩进,重启,放大招)

在ProviderCacheController类中添加一个本地Cache对象,在保证其线程安全的前提下,提高其性能

 //构建一个本地(Local)缓存对象(基于jvm中的一个对象存储从数据库获取的数据).
    private List<String> cache=new CopyOnWriteArrayList<>();
    @RequestMapping("/provider/cache02")
    public  List<String> doUseLocalCache02(){
        if(!useLocalCache){//假如没有打开本地Cache,则直接访问数据库
            System.out.println("==Get data from database==");
            return Arrays.asList("Category-A", "Category-B", "Category-C");
        }
        if(cache.isEmpty()) {
            synchronized (cache) {
                if (cache.isEmpty()) {//Thread-A,Thread-B,...
                    System.out.println("==Get data from database==");
                    //假设这部分分类信息是从数据库获取的,但是,我不希望每次获取分类信息都要从数据库查
                    List<String> cates = Arrays.asList("Category-A", "Category-B", "Category-C");
                    cache.addAll(cates);
                }
            }
        }
        return cache;
    }//生产层面

单线程定义任务工具类

package com.jt.common.util;
import java.util.Timer;
import java.util.TimerTask;
import java.util.concurrent.ScheduledExecutorService;

/**
 * 单线程定义任务工具类
 */
public class TimerUtils {
    public static void main(String[] args) {
        //1.构建执行任务的对象(这里选择java中的Timer对象)
        //Timer对象创建时会创建一个线程,并且为线程分配一个任务队列
        Timer timer=new Timer();
        //2.构建任务对象
        TimerTask task1=new TimerTask() {
            @Override
            public void run() {
                System.out.println(System.currentTimeMillis());
                //timer.cancel(); 结束任务调度
            }
        };
        //3.定时执行任务
        timer.schedule(task1,//要执行的任务
                1000,//1秒以后开始执行
                1000);//每隔1秒执行1次
        //基于Timer类执行定时任务时,最大的缺陷是多个任务不能并发执行.
    }
}

小节面试分析

Nacos配置管理模型的背景?(环境不同配置不同)
Nacos配置中的管理模型是怎样的?(namespace,group,service/data-id)
Nacos客户端(微服务)是否可以读取共享配置?(可以)
总结(Summary)

重难点分析

配置中心的选型。(市场活跃度、稳定性、性能、易用)
Nacos配置中心基本应用。(新建,修改、删除配置以后,在Nacos客户端应用配置)
配置管理模型应用。(namespace,group,service/dataId)
Nacos配置变更的动态感知。(底层原理分析)

FAQ分析

为什么需要配置中心?(动态管理发布配置,无需重启服务,更好保证服务的可用)
配置中一般要配置什么内容?(经常变化的配置数据-日志级别,线程池、连接池、…)
市面上有哪些主流配置中心?(Nacos,….)
配置中心选型时要重点考虑哪些因素?(市场活跃度、稳定性、性能、易用)
Nacos客户端(微服务业务)如何动态感知配置中心数据变化的?(nacos2.0之前nacos客户端采用长轮询机制每隔30秒拉取nacos配置信息.)
Nacos配置管理模型是怎样的?(命名空间-namespace,分组-group,服务实例-dataId)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值