微服务——配置中心(重点)

x33g5p2x  于2021-10-26 转载在 其他  
字(4.8k)|赞(0)|评价(0)|浏览(419)

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;
    }
}

相关文章