服务治理---注册中心,openfeign

1.为什么会有注册中心?

        在微服务拆分的理念中,我们必须遵循每个服务尽量的完全独立,类独立,接口独立,方法独立,不依赖别的服务,这样就最大程度的耦合性降低。但随之而来的却是一系列问题,像我们一个接口可能就会调用别的服务的接口,这样就会逻辑上的跨越主机。但为了遵循服务独立的理念,我们在这种情况就可以选择远程调用,对别的服务发起网络请求,这样看似是解决了问题,但如果这个接口的并发量非常大,我们可以多搭建几个同样的服务供调用者来调用,但这时,发起网络请求就不知道请求谁了,比如某一个服务不能正常运行了,调用者不能实时监控这些服务,于是服务治理的理念就出来了。

        服务治理有三个角色:服务提供者,服务调用者,注册中心。当每个微服务运行起来的时候,就会去注册中心注册自己的信息,比如端口号,ip地址等等。当调用者需要调用的时候,就去注册中心去订阅服务,然后通过负载均衡的算法,选择某一个服务进行调用。并且服务供给者会和注册中心形成一个心跳,给注册中心汇报自己的健康情况,如果某个供给者没有汇报,那注册中心就会剔除这个供给者,并且给之前订阅过这个服务的调用者推送变更消息。

2.注册中心nacos

服务注册

要使用nacos,首先得让docker把nacos跑起来

然后引入依赖,配置naocs地址

<!--nacos 服务注册发现-->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
 spring:
    application:
        name:xxx.service
    cloud:
        nacos:
          discovery:
            server-addr: 192.168.203.130:8848

然后运行这个服务,这个服务就会自动的去注册自己的信息到nacos,去nacos控制台就可以看见注册的服务了

服务发现

1.引入nacos的依赖和配置nacos地址

<!--nacos 服务注册发现-->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
 spring:
    application:
        name:xxx.service
    cloud:
        nacos:
          discovery:
            server-addr: 192.168.203.130:8848

2.用DiscoverClient来调用获取服务实例

private final DiscoveryClient discoveryClient;

private void handleCartItems(List<CartVO> vos) {
    // 1.根据服务名称,拉取服务的实例列表
    List<ServiceInstance> instances = discoveryClient.getInstance("xxx.service");
    // 2.负载均衡,挑选一个实例
    ServiceInstance instance = instance.get(RandomUtil.randomInt(instances.size()));
    // 3.获取实例的ip和端口
    URI uri = instance.getUri(); //uri = http://your_ip:your_port
} 

3.openfeign怎么用

在spring7之前,负载均衡都用的是Ribbon,现在新版用的是openfeign。

3.1先引入依赖

  <!--openFeign-->
  <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-openfeign</artifactId>
  </dependency>
  <!--负载均衡器-->
  <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-loadbalancer</artifactId>
  </dependency>

3.2在启动类上加入@EnableFeignClients注解

3.3编写OpenFeign客户端

@FeignClient(value = "item-service")
public interface ItemClient {
    @GetMapping("/items")
    List<ItemDTO> getItemByIds(@RequestParam("ids") List<Long> ids);
}

3.4调用

List<ItemDTO> items = itemClient.getItemByIds(itemIds);

3.5 openfeign底层采用的是HttpURLConnection,效率低下,我们可以采用连接池的方式

引入依赖

<!--OK http 的依赖 -->
<dependency>
  <groupId>io.github.openfeign</groupId>
  <artifactId>feign-okhttp</artifactId>
</dependency>

yaml 开启连接池

feign:
  okhttp:
    enabled: true # 开启OKHttp功能

3.6 日志

OpenFeign只会在FeignClient所在包的日志级别为DEBUG时,才会输出日志。而且其日志级别有4级:

  • ONONE:不记录任何日志信息,这是默认值。
  • BASIC:仅记录请求的方法,URL以及响应状态码和执行时间
  • HEADERS:在BASIC的基础上,额外记录了请求和响应的头信息
  • FULL:记录所有请求和响应的明细,包括头信息、请求体、元数据

由于Feiqn默认的日志级别就是NONE,所以默认我们看不到请求日志

要自定义日志级别需要声明一个类型为Logger.Level的Bean,在其中日志级别为

public class DefaultFeignConfig {
    @Bean
    public Logger.Level feignLogLevel(){
        return Logger.Level.FULL;
    }
}

但此时这个Bean并未生效,要想配置某个FeignClient的日志,可以在@FeignClient注解中声明:

@FeignClient(vlaue = "item-service", configuration = DefaultFeignConfig.class)

如果想要全局配置,让所有FeignClient都按照这个日志配置,则需要在@EnableFeignConfig注解中声明:

@EnableFeignClients(defaultConfiguration = DefaultFeignConfig.class)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值