2021-10-25

@FeignClient注解中fallbackFactory属性的作用是什么?如何使用这个属性.?

在FeignClient中,我们通过制定fallbackFactory,可以在服务不可用时自动调用fallbackFactory制定的处理方法。

类似aop:

package com.cy.consumer.Service;

import feign.hystrix.FallbackFactory;
import org.springframework.stereotype.Component;

/**
 * 远程服务回调工厂
 */
@Component
public class ProviderFallbackFactory implements FallbackFactory<RemoteProviderService> {
    @Override
    public RemoteProviderService create(Throwable throwable) {
//        return  new RemoteProviderService() {
//            @Override
//            public String schoMsg(String server) {
//                return "程序员小哥哥送货去了";
//            }
//        };
             return (msg)->{
                 return "程序员小哥哥送货去了";
             };
    }
 }

网络编程

模拟一个简易的Tomcat

package com.jt.common.net;
import java.io.IOException;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
/**
 * 模拟一个简易的tomcat(服务)
 * 基于Java中的网络编程实现(java.net)
 * 1)网络服务端(ServerSocket)
 * 2)网络客户端(Socket)
 */
public class Tomcat {//企业规范
    public static void main(String[] args) throws IOException {
        //1.创建服务(例如:启动nacos,启动....),并在9999端口进行监听
        //网络中计算机的唯一标识是什么?ip
        //计算机中应用程序的唯一标识是什么?port
        ServerSocket server=new ServerSocket(9999);
        System.out.println("server start ...");
        //2.启动服务监听
        while(true){
            //监听客户端的链接(这里的socket代码客户端对象)
            Socket socket=server.accept();//阻塞方法
            //在这里可以将socket对象的信息记录一下.(服务注册)
            //创建输出流对象,向客户端输出hello client
            OutputStream out =
                    socket.getOutputStream();
            //byte[] responseContent="hello client".getBytes();
            byte[] responseContent=("HTTP/1.1 200 ok \r\n" +
                    "Content-Type: text/html;charset=utf-8 \r\n" +
                    "\r\n" +
                    "<h2>hello client</h2>").getBytes();
            out.write(responseContent);
            out.flush();
        }
    }
}

模拟一个简易的浏览器

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 {
        //1.创建网络编程中的客户端对象(Socket)
        //构建Socket对象时要执行连接个计算机(ip),访问计算机中的哪个应用(port)
        Socket socket=new Socket("127.0.0.1",9999);//TCP
        //2.创建一个输入流对象,读取服务端写到客户端的数据
        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);
        //3.释放资源
        socket.close();
    }
}

idea配置mysql数据库

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-67mzOQ9S-1635164136347)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20211025150826850.png)]

jdbc:mysql://localhost:3306/nacos_config?serverTimezone=Asia/Shanghai&charcterEncoding=utf8

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JBhzL9pm-1635164136357)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20211025150916076.png)]

日志配置输出级别

package com.cy.provider.Controller;

import lombok.extern.slf4j.Slf4j;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;


/**
 * 基于此controller演示配置中心的作用
 * 输出日志测试
 * slf4j使用了门面模式,Simple Logging Facade for Java (SLF4J)  网址->http://www.slf4j.org/
 */
@RequestMapping("/provider")
@RestController
@Slf4j  //lombok中的注解代替我们创建LoggerFactory.getLogger(ProviderLogController.class);对象
public class ProviderLogController {
    //java中只要使用日志对象,就采用下面这种方式创建
//    private static final Logger log= LoggerFactory.getLogger(ProviderLogController.class);
    @GetMapping("/log/doLog01")
    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";
    }

}

配置文件

server:
  port: 8082
spring:
  application:
    name: sca-provider
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848 #nacos在一台电脑可以不配置
      config:
        server-addr: localhost:8848 #配置地址
        file-extension: yml #定义配置中心配置的格式
  level:
    com.cy: debug #配置com.cy包的日志级别
    

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-apG14ps8-1635164136370)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20211025153506597.png)]

修改配置文件,修改更高级别的

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gMHhTYyQ-1635164136378)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20211025154033750.png)]

配置中心(yml)优先级别更高,但是优先级别低的会覆盖优先级别高的,所以最后展现的是优先级别低的

添加依赖

<!--        添加了nacos配置中心依赖,此项目中就会多一些java类-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        </dependency>

以结果为导向,注意缩近,注意单词是否正确,最主要的是配置,代码没有太多,但是格式极为严格

这是配置为error的,正确结果

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1zB9fUIZ-1635164136382)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20211025160244607.png)]

配置中心动态发布测试

启动sca-provider服务,然后打开浏览器,输入http://localhost:8081/provider/log/doLog01,检测idea控制台日志输出。然后再打开nacos控制台动态更新日志级别,再访问资源并检测后台日志输出.

Nacos 动态刷新机制分析

对于nacos配置中心而言,有系统内部对配置变化的感知,还有外部系统对配置的感知,假如我们系统在浏览器中能看到日志级别的变化,该如何实现呢?我们现在来实现一个案例.

第一步:在ProviderLogController类的上面添加一个@RefreshScope注解,例如:

package com.cy.provider.Controller;

import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
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.RequestMapping;
import org.springframework.web.bind.annotation.RestController;


/**
 * 基于此controller演示配置中心的作用
 * 输出日志测试
 * slf4j使用了门面模式,Simple Logging Facade for Java (SLF4J)  网址->http://www.slf4j.org/
 */
@RequestMapping("/provider")
@RestController
@Slf4j  //lombok中的注解代替我们创建LoggerFactory.getLogger(ProviderLogController.class);对象
@RefreshScope//针对于我们配置中心构建监听器,如果配置中心内容发生变化,重新构建此对象
public class ProviderLogController {
    //java中只要使用日志对象,就采用下面这种方式创建
//    private static final Logger log= LoggerFactory.getLogger(ProviderLogController.class);
    @GetMapping("/log/doLog01")
    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";
    }
    @Value("${logging.level.com.cy}")
    private String logLevel;
    @GetMapping("/log/doLog02")
    public String doLog02(){//trace<debug<info<warn<error
       log.info("log.level is {}",logLevel);//{}表示占位符
        return "log level is "+logLevel;
    }


}

阿波罗配置中心

Nacos 注册中心入门~~核心知识点

注册中心诞生的背景? (所有公司需要在工商局进行备案)
注册中心的选型?(社区活跃度,稳定性,功能,性能,学习成本)
Nacos下载,安装,配置,启动,访问(http://ip:port/nacos)
服务向Nacos的注册?(添加依赖,服务配置,启动服务并检查)
Nacos进行服务监控的方式?(心跳包)
服务(进程)之间的调用?(借助RestTemplate.思考Spring中的JdbcTemplate,SqlSessionTemplate等对象的作用)

常见问题分析

注册中心诞生的背景? (服务多了,需要对服务进行更好管理)
市场上常用的注册中心?(Zookeeper,Eureka,Nacos,Consul)
如何对注册中心进行选型?(社区活跃度,稳定性,功能,性能,学习成本)
Nacos 是什么?(是Alibaba公司基于SpringBoo技术t实现的一个注册中心,本质上也是一个服务)
Nacos 的基本架构?(Client/Server架构)
Nacos 主要提供了什么核心功能?(服务的注册,发现,配置)
Nacos 服务启动需要什么前置条件?(配置JDK的JAVA_HOME目录,安装MySQL5.7以上版本,配置连接的数据库)
Nacos 服务单机模式,window平台下启动时的指令是什么?(startup.cmd -m standalone)
实现Nacos服务注册需要添加什么依赖?(两个)
实现Nacos服务注册时,必须做哪些配置?(服务名,假如是本机服务注册可以省略服务地址)
Nacos如何检查服务状态?(通过心跳包实现)
服务之间进行服务调用时,使用了什么API?(RestTemplate)
Day04~Nacos 配置中心入门

核心知识点

配置中心诞生的背景(分布式架构下如何动态发布和更新配置)
市场上主流的配置中心(Nacos,…)
Nacos配置中心的基本应用(添加依赖,修改配置文件名以及内容,新建配置,应用配置)
*@RefreshScope注解的应用(描述类,实现类中属性值@Value与配置中心中内容的同步)
常见问题分析
为什么要使用配置中心?(项目上线后实现配置的动态发布和更新)
你知道哪些主流配置中心?
Nacos配置中心如何应用?
Java项目中你用的日志API是什么?(org.slf4j.Logger)
你项目中为什么使用org.slf4j.Logger对象记录日志?此对象是日志规范,是对外面的门面,可以更好降低耦合
@Slf4j注解的作用是什么?(此注解属于lombok,用于描述类,在类中创建org.slf4j.Logger对象)
你知道Java中有哪些常用日志级别?(debug<info<warn<error)
Java日志在设计时为什么要设计日志级别?(方便根据级别调整日志输出)
Java中日志级别的配置通常要写到哪里?(配置中心)
你觉得Nacos配置中心通常会配置哪些内容?(可能经常变化的数据)
Nacos配置中心依赖对项目中配置文件的名字有要求吗?(bootstrap.yml)
Nacos中@RefreshScope注解的应用场景以及作用.
如何在初始化对象属性时从配置中心读取配置内容?(@Value注解对属性进行描述)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值