SpringDemo(7)--项目中集成feign,使用@FeignClient注解实现feign客户端

一、注册feign客户端,购物车服务 调用 用户服务的接口

1.1、前提说明

  • 购物车服务:cart-service 。购物车服务中 新建http接口:"/cart/getUserCart"。
  • 用户服务:user-service 。用户服务中 新建http接口: "/user/getUserInfo" 。
  • 在调用购物车服务的"/cart/getUserCart"接口时,购物车服务 会通过feign客户端 去调用 用户服务的 "/user/getUserInfo" 接口。
  • 在 user-api 项目中,使用@FeignClient 注解,定义feign客户端接口:UserInfoAPI.java 。

1.2、user-api 项目

1.2.1、user-api 项目的 pom.xml ,增加 openfeign 依赖

 <!-- feign 配置 -->
 <dependency>
     <groupId>org.springframework.cloud</groupId>
     <artifactId>spring-cloud-starter-openfeign</artifactId>
     <version>2.2.5.RELEASE</version>
 </dependency>

1.2.2、user-api 项目中新增接口 UserInfoAPI.java,接口上加 @FeignClient 注解(用于注册feign客户端)。

        说明:项目启动时,带有 @FeignClient 注解的接口 会被Spring Bean 容器实例为一个动态代理对象。

import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;

//@FeignClient注解的 name 不能为空
@FeignClient(name = "userInfoApi", url = "http://localhost:8081/user")
public interface UserInfoAPI {

    @GetMapping("/getUserInfo")
    String getUserInfo();
}

1.3、user-service项目

1.3.1、user-service项目的 pom.xml 增加 openfeign 依赖(代码同 1.2.1)

1.3.2、user-service项目中新建 UserInfoController 类,并实现user-api 项目中的 UserInfoAPI 接口。

import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@Slf4j
@RestController
@RequestMapping("/user")
public class UserInfoController implements UserInfoAPI {

    @GetMapping("/getUserInfo")
    public String getUserInfo(){
        log.info("用户服务,getUserInfo()方法被调用");
        return "我是用户 OHZ ";
    }
}

1.4、cart-service项目

1.4.1、cart-service项目的 pom.xml  文件中,增加对 openfeign 和 user-api 模块的依赖

<!-- feign 配置 -->
<dependency>
     <groupId>org.springframework.cloud</groupId>
     <artifactId>spring-cloud-starter-openfeign</artifactId>
     <version>2.2.5.RELEASE</version>
</dependency>

<!-- 依赖 ohz 自己的模块 -->
 <dependency>
     <groupId>com.ohz.user</groupId>
     <artifactId>user-api</artifactId>
     <version>0.0.1-SNAPSHOT</version>
     <!--<scope>compile</scope>-->
 </dependency>

1.4.2、cart-service项目的启动类上,加上 @EnableFeignClients ,并指定要扫描的feign客户端的包名。

        说明:项目启动时,带有 @FeignClient 注解的接口会被Spring Bean 容器实例一个动态代理对象。

package com.ohz.cart;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients;

@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients(basePackages = {"com.ohz"})
public class CartServiceApplication {
    public static void main(String[] args) {
        SpringApplication.run(CartServiceApplication.class, args);
        System.out.println("购物车服务,启动完成");
    }
}

1.4.3、cart-service项目中,新建 CartController 类,并将 UserInfoAPI 通过 @Autowired 注解注入到此类中。

package com.ohz.cart.controller;

import com.ohz.user.controller.UserInfoAPI;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.beans.factory.annotation.Autowired;

@Slf4j
@RestController
@RequestMapping("/cart")
public class CartController {

    @Autowired
    private UserInfoAPI userInfoAPI;

    @GetMapping("/getUserCart")
    public String getUserCart() {
        return "查询用户的购物车,用户信息:\'" + userInfoAPI.getUserInfo() 
                + "\',购物车为空。";
    }
}

1.5、测试验证

1.5.1、调用购物车的"/cart/getUserCart"接口,查看接口响应结果

二、项目集成nacos后,@FeignClient 客户端从中去获取具体的服务ip和端口号

2.1、前提说明

  • 在上面第一部分的基础上,对 user-api 项目中的 UserInfoAPI.java 接口进行修改。

2.2、修改 @FeignClient 客户端 的定义方式

2.2.1、nacos服务端,用户服务注册的信息如下:

2.2.2、修改 user-api 项目中 UserInfoAPI.java 接口的 @FeignClient 注解:仅指定 name,不指定 url

        说明:其中,name 为 用户服务 在nacos中注册的服务名。feign客户端进行调用时,会从nacos中获取具体的用户服务的ip和端口号。

import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;

//@FeignClient注解的 name 不能为空
@FeignClient(name = "user-service")
public interface UserInfoAPI {

    @GetMapping("/getUserInfo")
    String getUserInfo();
}

2.3、测试验证

2.3.1、调用购物车的"/cart/getUserCart"接口,查看购物车服务的日志,可发现多了从nacos获取服务实例的日志

2023-06-01 22:10:05.325  INFO 33455 --- [nio-8082-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring DispatcherServlet 'dispatcherServlet'
2023-06-01 22:10:05.325  INFO 33455 --- [nio-8082-exec-1] o.s.web.servlet.DispatcherServlet        : Initializing Servlet 'dispatcherServlet'
2023-06-01 22:10:05.330  INFO 33455 --- [nio-8082-exec-1] o.s.web.servlet.DispatcherServlet        : Completed initialization in 5 ms
2023-06-01 22:10:05.863  INFO 33455 --- [nio-8082-exec-1] c.netflix.config.ChainedDynamicProperty  : Flipping property: user-service.ribbon.ActiveConnectionsLimit to use NEXT property: niws.loadbalancer.availabilityFilteringRule.activeConnectionsLimit = 2147483647
2023-06-01 22:10:05.908  INFO 33455 --- [nio-8082-exec-1] c.netflix.loadbalancer.BaseLoadBalancer  : Client: user-service instantiated a LoadBalancer: DynamicServerListLoadBalancer:{NFLoadBalancer:name=user-service,current list of Servers=[],Load balancer stats=Zone stats: {},Server stats: []}ServerList:null
2023-06-01 22:10:05.916  INFO 33455 --- [nio-8082-exec-1] c.n.l.DynamicServerListLoadBalancer      : Using serverListUpdater PollingServerListUpdater
2023-06-01 22:10:05.945  INFO 33455 --- [nio-8082-exec-1] c.netflix.config.ChainedDynamicProperty  : Flipping property: user-service.ribbon.ActiveConnectionsLimit to use NEXT property: niws.loadbalancer.availabilityFilteringRule.activeConnectionsLimit = 2147483647
2023-06-01 22:10:05.948  INFO 33455 --- [nio-8082-exec-1] c.n.l.DynamicServerListLoadBalancer      : DynamicServerListLoadBalancer for client user-service initialized: DynamicServerListLoadBalancer:{NFLoadBalancer:name=user-service,current list of Servers=[127.0.0.1:8081],Load balancer stats=Zone stats: {unknown=[Zone:unknown;	Instance count:1;	Active connections count: 0;	Circuit breaker tripped count: 0;	Active connections per server: 0.0;]
},Server stats: [[Server:127.0.0.1:8081;	Zone:UNKNOWN;	Total Requests:0;	Successive connection failure:0;	Total blackout seconds:0;	Last connection made:Thu Jan 01 08:00:00 CST 1970;	First connection made: Thu Jan 01 08:00:00 CST 1970;	Active Connections:0;	total failure count in last (1000) msecs:0;	average resp time:0.0;	90 percentile resp time:0.0;	95 percentile resp time:0.0;	min resp time:0.0;	max resp time:0.0;	stddev resp time:0.0]
]}ServerList:com.alibaba.cloud.nacos.ribbon.NacosServerList@2c0925fb
2023-06-01 22:10:06.922  INFO 33455 --- [erListUpdater-0] c.netflix.config.ChainedDynamicProperty  : Flipping property: user-service.ribbon.ActiveConnectionsLimit to use NEXT property: niws.loadbalancer.availabilityFilteringRule.activeConnectionsLimit = 2147483647

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值