前言
准备学习 Spring Cloud,在QQ阅读上按照书《Spring Cloud 微服务快速上手》来学习。
首先学习的内容就是 Web 服务客户端 通过OpenFeign 访问服务端(服务端已注册在 nacos 中)。
一、启动nacos
在nacos官网下载最新版本的nacos,然后解压到某个文件夹,比如
D:\Program Files\nacos
然后用cmd打开其下的bin文件夹,执行
startup.cmd -m standalone
这就在本机启动了单机版 nacos,可以供调试使用。
可以通过 http://localhost:8848/nacos 尝试访问Nacos的管理页面(管理页面默认用户名和密码都是nacos)。
我们可以看到服务列表是空的,这个时候还没有任何服务注册到这个nacos的注册中心。
二、建立项目
按照书上写的,建立三个 spring web 项目,分别为 passager-api, pay-service, order-service。
passager-api作为客户端,也就是消费方,将调用pay-service提供的服务,·而order-service,这里其实没有被用到。
1.passager-api
passager-api 的 pom.xm要引入:
spring-cloud-starter-alibaba-nacos-discovery
spring-cloud-starter-openfeign
spring-cloud-starter-loadbalancer
要注意的是:
dependencyManagement中的
spring-cloud-dependencies版本,要和spring boot的版本兼容
(通过 https://start.spring.io/actuator/info 可以查到哪些版本兼容)
这个项目spring boot 用的3.3.3,spring cloud 选择的 2023.0.3,可以兼容
spring-cloud-alibaba-dependencies版本,要和spring-cloud-dependencies版本兼容,这里 spring-cloud-alibaba-dependencies 用的 2023.0.1.0版本。
在passager-api的启动类上注解 @EnableFeignClients,使得项目支持Feign。
在application.yml中配置好nacos
spring:
application:
name: passager-api
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
server:
port: 9001
logging:
level:
root: TRACE
定义一个service接口
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
@FeignClient(value = "pay-service")
public interface IFeignClient {
@RequestMapping(value = "/provider/test", method = RequestMethod.GET)
String callPay();
}
这个接口的 callPay() 方法将访问pay-service 的 provider/test 接口。
定义controller 中的方法
test()方法将调用callPay()方法,也就会调用pay-service中暴露的接口
import org.example.passagerapi.service.IFeignClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/webclient")
public class WebClientController {
@Autowired
private IFeignClient iFeignClient;
@GetMapping("/test")
public String test() {
return iFeignClient.callPay();
}
}
2.pay-service
pay-service 的pom.xml 要引入
spring-cloud-starter-alibaba-nacos-discovery
类似于passager-api ,在 application.yml 中配置好 nacos,以便将项目注册到nacos
这就是一个普通的 spring web 项目,通过controller对外提供服务
三、启动项目
分别启动 passager-api 和 pay-service 项目,它们将会出现在nacos 服务列表中
然后我们通过 http://localhost:9001/webclient/test 访问 passager-api 的controller方法,就会调用到 pay-service 的 /provider/test 接口
关键说明
@FeignClient(value = “pay-service”)
是使得service 访问名为 pay-service 的服务,
loadbalancer会将对 http://pay-service/provider/test 的访问 转化为访问 http://192.168.31.136:9003/provider/test