SpringCloud

Nacos注册中心和Feign远程调用

下载解压打开Nacos跳转到bin目录输入   startup.cmd -m standalone  启动

父工程导入依赖

            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>2.2.5.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>

客户端导入依赖

        <!-- nacos客户端依赖包 -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>

在yaml文件中设置Nacos地址

spring 
     cloud:     #nacos服务地址
        nacos:
          server-addr: localhost:8848 #nacos服务地址

   重启服务 登入Nacos地址 点击服务列表  即可查看是否被注册进Nacos

我们还可以针对多个服务设置多个集群,避免跨集群调用,如果本地集群中的所有服务挂了以后才会调用其他集群的服务。

spring 
     cloud:     #nacos服务地址
        nacos:
          server-addr: localhost:8848 #nacos服务地址
      discovery:
        cluster-name: HZ  集群名称 上海

负载均衡和Euraka中设置的一样

        可以在启动类重写IRule或者在yml中设置新的规则

 @Bean
 public IRule randomRule(){ return  new RandomRule(); }



userservice:   #要配置的服务器的名称采取负载均衡的方式的总类
  ribbon:
    NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule  #修改userservice负载均衡的规则

权重

        Nacos中找到 服务列表 点击 详情  点击编辑即可对服务进行权重设置

        0到1之间    数值越高访问的比例越大,数值为0时不访问。

Nacos 通过 namespace 来实现环境隔离功能。

        我们常用的有Test测试环境,dev开发环境等多种环境。

我们可以在Nacos的空间中创建namespace,来进行环境区分。

        命名空间---新建命名空间  即可创建一个新的namespace  伴随着也会生成一个随机的id           将id书写在yml文件中即可对服务进行隔离。

        设置ephemeral 为trul 或者 false   即可设置该服务是否为临时实例或非临时实例

临时实例,如果服务挂了就会被Nacos删除     非临时实例,如果服务挂了不会删除而是等待服务重启

 string
    nacos:
      server-addr: localhost:8848 #nacos服务地址
      discovery:
        cluster-name: HZ
       namespace: aaf83a77-0a18-4d4a-b36f-6e019778bda5 #dev 命名空间环境  
       ephemeral: false #是否是临时的

Nacos的配置管理

        在 Nacos 控制面板中添加配置文件   以服务名称+环境+yaml命名

        多服务的配置也可交给Nacos进行管理,使用Nacos以后项目启动会先去Nacos里面加载配置文件,但是如果我们还把Nacos的地址放在application.yml中那就失去意义了,因此我们可以创建一个优先级最高的bootstrap.yml文件中。

        首先导入Nacos管理依赖

        <!--nacos的配置管理依赖-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        </dependency>

        bootstrap.yml文件

spring:
  application:
    name: userservice  #服务名称
  profiles:
    active: dev #环境
  cloud:
    nacos:
      server-addr: localhost:8848  #Nacos地址
      config:
        file-extension: yaml  #后缀名

         通过bootstrap.yml文件中的服务名称+环境+后缀名 去加载Nacos 控制面板中的配置文件

        配置文件分为三种

   第一种:userservice-dev.yaml     第二种:userservice.yaml      第三种:本地的配置文件

  第一种可能会因为环境不一样不被加载,但是第二种是无论如何都会被加载的。

优先级

        三种文件出现了同一个属性那么就会产生优先级

  第一种 > 第二种 > 第三种                                                                                       

服务名称+当前环境+yaml  >  服务名称+.yaml > 本地配置

Feign远程调用

        需要使用Feign的服务中引入依赖

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

        启动类加入注解开启Feign远程调用

@EnableFeignClients(defaultConfiguration = DefaultFeignConfiguration.class)  // 开启Feign远程调用

        在Service中创建一个用于接口调用的接口类

import cn.itcast.feign.pojo.User;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;

@FeignClient("userservice")
public interface UserClient {

    @GetMapping("/user/{id}")
    User findById(@PathVariable("id") Long id);
}

        这样其他需要调用userservice/user/id  接口中的数据的服务只要注入UserClient 接口并Get当中的方法就能获取接口中的数据并实现远程调用。

    @Autowired
    private UserClient userClient;

    public Order queryOrderById(Long orderId) {
        // 1.查询订单
        Order order = orderMapper.findById(orderId);
        // 2.利用restTemplate发送http请求;
        User user = userClient.findById(order.getUserId());
        System.out.println(user);
        //3.把数据封装到order中
        order.setUser(user);
        // 4.返回
        return order;
    }

Feign的优化

        日志尽量用basic/none,none为默认日志

        第二种就是更改底层框架,使用连接池更改默认的URLConnection的请求方式

  • URLConnection:默认实现,不支持连接池
  • Apache HttpClient :支持连接池
  • OKHttp:支持连接池

导入依赖   Apache HttpClient 

        <!--httpClient的依赖   优化Feign -->
        <dependency>
            <groupId>io.github.openfeign</groupId>
            <artifactId>feign-httpclient</artifactId>
        </dependency>

更改yml配置文件

#Feign日志连接池:
feign:
  httpclient:
    enabled: true
    max-connections: 200   #最大连接数
    max-connections-per-route: 50 #单个路劲连接数

打成jar包       

        如果服务多了这样也很麻烦于是我们可以把包括user实体类和接口数据以及配置文件打成jar包,让需要用的服务,直接引入jar包,不需要创建实体类以及接口文件。

        在新建文件服务导入依赖

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

        其他需要用到这个jar包的直接导入依赖即可

<dependency>
    <groupId>com.lz.feign</groupId>
    <artifactId>feign-api</artifactId>
    <version>1.0</version>
</dependency>

        然后在启动类的@EnableFeignClients注解中指定导入的jar包

原先
@EnableFeignClients(defaultConfiguration = DefaultFeignConfiguration.class)

@EnableFeignClients(clients = UserClient.class, defaultConfiguration = DefaultFeignConfiguration.class) 

clients 后面是集合类型,可以同时引入多个接口

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值