Nacos中Feign的远程调用深入理解

微服务模块间通信

微服务是由很多模块组成,但彼此之间又会进行互相调用,那么就会有方法来实现这个api接口进行远程调用,常见的调用方法有restTemplate,还有feign等,但随着使用,我们好像发现,feign的使用会更轻松,代码更可观,也更好的去理解。

RestTemplate

import org.springframework.web.client.RestTemplate;

 @Autowired
    private RestTemplate restTemplate;

我们可以看到这个类是在springframework包下的,所以可以直接引用。

下面我们来看一下restTemplate在使用时的方式:

public Order queryOrderById(Long orderId) {
        // 1.查询订单
        Order order = orderMapper.findById(orderId);
        // 2.利用RestTemplate发起http请求,查询用户
        // 2.1.url路径
        String url = "http://userservice/user/" + order.getUserId();
        // 2.2.发送http请求,实现远程调用
        User user = restTemplate.getForObject(url, User.class);
        // 3.封装user到Order
        order.setUser(user);
        // 4.返回
        return order;
    }
getForObject():

更偏向于直接获取响应内容的,因为他直接返回响应实体的body(响应内容)

具体的关于RestTemplate的文章可以去阅读:http://t.csdn.cn/NH2Pl

我们在使用的时候还需要通过url来进行详细的拼接, 这里的usrservice是我们的模块名称,也是服务名称,他是注册在服务的注册中心当中,我们通过负载均衡策略去服务中心进行拉取最后决定选择哪一个服务进行调用。类似于userservice->localhost:8080,这是在本地和服务配置实现的。可以使用eureka和nacos服务注册中心。

这样的代码,肉眼课间的有些混乱和不美观,因此,我们打算使用feign来进行优化远程调用。

Nacos和Feign

Nacos不但是服务注册中心,也是配置中心。

我们在使用nacos,和feign的时候需要先导入依赖:

如果要使用nacos+feign可以直接导入这部分依赖就可以,不想区分就两个服务都导入,当然是你有引入spring-cloud等父依赖的情况下,依赖版本需要配置完整,我这里有依赖继承,可以根据自己的springboot版本来进行修改自己的依赖版本。

         <!-- nacos客户端依赖包 -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
         <!--nacos的配置管理依赖-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        </dependency>
         <!--feign客户端依赖-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>
        <!--引入HttpClient依赖-->
        <dependency>
            <groupId>io.github.openfeign</groupId>
            <artifactId>feign-httpclient</artifactId>
        </dependency>
        <!--引入feign的统一api-->
        <dependency>
            <groupId>cn.itcast.demo</groupId>
            <artifactId>feign-api</artifactId>
            <version>1.0</version>
        </dependency>

orderservice去调用userservice,所以都需要在注册中心进行注册,以及配置相应的日志级别和负载均衡策略,这里可以提供相关的参考来进行自己的配置。

orderservice的application.yml:这里的配置文件,application.name,和cloud.nacos和feign可以参考配置

erver:
  port: 8088
spring:
  datasource:
    url: 
    username: 
    password: 
    driver-class-name: com.mysql.jdbc.Driver
  application:
    name: orderservice
  cloud:
    nacos:
      server-addr: localhost:8848 # nacos服务地址
mybatis:
  type-aliases-package: 
  configuration:
    map-underscore-to-camel-case: true
logging:
  level:
  
userservice:
  ribbon:
    NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule  # 负载均衡规则
ribbon:
  eager-load:
    enabled: true # 开启饥饿加载
    clients: # 指定饥饿加载的服务名称
      - userservice
feign:
  httpclient:
    enabled: true # 支持HttpClient的开关
    max-connections: 200 # 最大连接数
    max-connections-per-route: 50 # 单个路径的最大连接数

userservice的yml:

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

Nacos服务注册:

Feign的调用架构:

我们把feign的接口提取出来,并且将相关的类和配置都配置好,作为一个模块,供其他模块引入调用。

结合代码实例理解:

通俗来说就是order-service和user-service就是两个出租屋子,他们有自己的锁,但是他们都把钥匙放在feign里了,如果有人需要就去拿着使用,比如说order像进user屋里面溜达溜达,就去feign拿user的钥匙,这样就可以使用这个屋子了。

集合代码:

引入pojo是因为我们使用了这个类所返回对象的方法,和config则是:

注册为bean方法,放进spring容器

下图的启动类会有显示。

UserClient就相当于这个钥匙@FeignClient就相当于声明它是一个钥匙,而对于想要使用这个钥匙的人,比如order-service:

就需要在这个启动类里面去配置:

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

这个作用就是springboot去自动扫描容器内的feignclient,就是你要使用出租屋,你得知道钥匙放在哪里吧(@EnableFeignClients),并且要使用哪一把钥匙(clients = UserClient.class)

@EnableFeignClients注解

packages就是你可以指定去配置扫描的包

@EnableFeignClients(basePackages = {"com.test.*"})

,clients也可以去扫名指定的类,前文已经提过。

Feign调用实例

这样服务和启动类配置好之后,springboot启动一扫描就知道,啊,原来我有这些屋子和钥匙可以使用,所以,order在使用user的时候就会变成:

是不是一下清爽了很多。

这里的userClient就是引用我们之前写的feign的包。

因此,我们在使用nacos+feign的时候明显会比之前用restTemplate舒服了很多,希望这篇文章有助于大家理解,如果对你有帮助的话,恳请点个赞鼓励一下哦

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
使用Nacos整合Feign进行HTTPS远程调用,需要以下步骤: 1. 在Nacos注册服务,并启用HTTPS协议。 2. 在Feign的配置添加HTTPS相关的配置,如下: ```java @Configuration public class FeignConfig { @Bean public Client feignClient() { return new OkHttpClient.Builder() .sslSocketFactory(createSSLSocketFactory()) .hostnameVerifier(createHostnameVerifier()) .build(); } private SSLSocketFactory createSSLSocketFactory() { try { SSLContext sslContext = SSLContext.getInstance("TLS"); sslContext.init(null, new TrustManager[]{new X509TrustManager() { @Override public void checkClientTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException { } @Override public void checkServerTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException { } @Override public X509Certificate[] getAcceptedIssuers() { return new X509Certificate[0]; } }}, new SecureRandom()); return sslContext.getSocketFactory(); } catch (NoSuchAlgorithmException | KeyManagementException e) { throw new RuntimeException(e); } } private HostnameVerifier createHostnameVerifier() { return (s, sslSession) -> true; } } ``` 3. 在Feign的接口上添加@FeignClient注解,并指定Nacos注册的服务名和HTTPS协议,如下: ```java @FeignClient(name = "service-provider", url = "https://service-provider", configuration = FeignConfig.class) public interface ServiceProviderClient { @GetMapping("/hello") String sayHello(); } ``` 这样就可以使用Nacos整合Feign进行HTTPS远程调用了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值