1. @FeignClient 中fallbackFactory属性
1.1作用
- 提供容错的手段
1.2代码实现
1.2.1创建FallbackFactory的实现类
package com.jt;
import com.jt.concumer.service.RemoteProviderService;
import feign.hystrix.FallbackFactory;
import org.springframework.stereotype.Component;
@Component/*远程服务回调工厂*/
public class ProviderFallbackFactory implements FallbackFactory<RemoteProviderService> {
@Override
public RemoteProviderService create(Throwable throwable) {
/*写法1--匿名内部类*/
// return new RemoteProviderService() {
// @Override
// public String echoMsg(String msg) {
// return "服务器正在维护中";
// }
// };
/*写法2--lambda表达式*/
return (msg)->{
return "服务器正在维护中!!";
};
}
}
1.2.2 @FeignClient注解中添加fallbackFactory属性
@FeignClient(name="sca-provider", fallbackFactory = ProviderFallbackFactory.class)
1.2.3修改yml文件
feign:
hystrix:
enabled: true
对远端服务调用的错误进行自动处理
1.2.4 向服务调用端进行休眠处理
1.2.5 实现效果
2.网络编程
2.1模拟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();
}
}
}
2.2模拟浏览器
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();
}
}
实现效果
使用RPC的方式实现进程间的通讯(IPC)
3.配置中心
3.1背景
以前,我们把软件配置写在一个配置文件中,然而,在分布式系统下,这样的方式就变得非常不好管理,并容易出错,基于这样的背景,配置中心诞生了。
3.2概念
应用程序在启动和运行的时候往往需要读取一些配置信息,配置基本上伴随着应用程序的整个生命周期,配置中心是用来统一管理项目中所有配置的系统。
常见的配置中心有:Apollo nacos
日志等级:trace<debug<info<warn<error
3.3入门案例
3.3.1创建Controller类
package com.jt.provider.controller;
import org.slf4j.Logger;/*java中的日志API规范*//*门面模式*/
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
/*演示配置中心的作用
* 基于日志对象进行日志输出对象测试
* */
@RestController
public class ProviderLogController {
/*创建日志对象*/
private static final Logger log=
LoggerFactory.getLogger(ProviderLogController.class);
@GetMapping("/provider/log/doLog01")
public String dolog01(){//trace<debug<info<warn<error
log.trace("===trace===");
log.debug("===debug===");
log.info("===info===");
log.warn("===warn===");
log.error("===error===");
return "log config test";
}
}
改进,将配置写到配置中心
3.3.2 添加配置依赖
添加nacos配置中心依赖,此时java中就多了一些类,可以从nacos配置中心中读取配置信息
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
3.3.3添加配置中心的地址与配置中心配置格式
3.3.4 在Nacos中添加配置
3.3.5修改配置文件名称为bootstrap.yml 启动优先级比较高
实现效果
优先读取配置文件,再读取配置中心,但是后面的配置会覆盖掉前面的配置
拓展:database连接数据库
3.4 配置中心动态发布测试
修改配置中心无需重启服务器
- @RefreshScope注解
- 监听器,告诉系统底层,配置中心内容发生变化,重新构建此对象
package com.jt.provider.controller;
import org.slf4j.Logger;/*java中的日志API规范*//*门面模式*/
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
//@Slf4j/*如果使用了此注解,就不用手动创建log对象,lombok会自动帮助创建log对象*/
@RefreshScope/*监听器,告诉系统底层,配置中心内容发生变化,重新构建此对象*/
public class ProviderLogController {
/*创建日志对象*/
private static final Logger log=
LoggerFactory.getLogger(ProviderLogController.class);
@GetMapping("/provider/log/doLog01")
public String dolog01(){//trace<debug<info<warn<error
log.trace("===trace===");
log.debug("===debug===");
log.info("===info===");
log.warn("===warn===");
log.error("===error===");
return "log config test";
}
@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;
}
}