一、注册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