@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注解对属性进行描述)