天行健,君子以自强不息;地势坤,君子以厚德载物。
每个人都有惰性,但不断学习是好好生活的根本,共勉!
文章均为学习整理笔记,分享记录为主,如有错误请指正,共同学习进步。
spring cloud 相关组件搭建(建议顺序):
注:本篇基于前两篇编写
使用方法:
在调用者的服务中创建一个接口
,并在接口上添加注解
,即可调用其他服务中的接口。
JDK版本:1.8
maven版本:3.9.0
开发工具:IDEA社区版ideaIC-2018.3
项目框架:spring boot 版本为 2.7.3 springboot搭建传送门spring cloud 版本为2021.0.5
以下均基于eureka和自己服务创建后的操作
具体请参考本文目录下的spring cloud搭建顺序的前两篇
两个自己的服务,分别为service1和service2
将service1作为服务的被调用者(具体接口所在的服务)
将service2作为服务的调用者(feign的使用者,会去调用service1中的接口)
主要是接口的编写,这里只是测试feign功能的实现就没有用到数据库和具体代码,只写了CRUD的简单接口,返回都是字符串。
包结构如下,比之前新增了红框中的内容
Service1Service.java
package com.service1.service;
/**
* @ClassDescription: crud接口
* @Author:李白
* @Date:2023/5/31 17:04
*/
public interface Service1Service {
String addInfo();
String removeInfo();
String changeInfo();
String searchInfo();
}
Service1ServiceImpl.java
添加@Service注解
package com.service1.service.Impl;
import com.service1.service.Service1Service;
import org.springframework.stereotype.Service;
/**
* @ClassDescription: crud接口实现类
* @Author:李白
* @Date:2023/5/31 17:05
*/
@Service
public class Service1ServiceImpl implements Service1Service {
@Override
public String addInfo() {
return "add info success";
}
@Override
public String removeInfo() {
return "remove info success";
}
@Override
public String changeInfo() {
return "change info success";
}
@Override
public String searchInfo() {
return "search info success";
}
}
Service1Controller.java
package com.service1.controller;
import com.service1.service.Impl.Service1ServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
/**
* @ClassDescription: crud请求控制类
* @Author:李白
* @Date:2023/5/31 17:07
*/
@RestController
@RequestMapping("/crud")
public class Service1Controller {
@Autowired
Service1ServiceImpl service1ServiceImpl;
@PostMapping
public String addInfo(){
return service1ServiceImpl.addInfo();
}
@DeleteMapping
public String remove(){
return service1ServiceImpl.removeInfo();
}
@PutMapping
public String change(){
return service1ServiceImpl.changeInfo();
}
@GetMapping
public String search(){
return service1ServiceImpl.searchInfo();
}
}
启动service1,使用postman访问接口
(请求注解这里用到了RESTful API ,增POST删DELETE改UPDATE查GET)
http://localhost:8002/crud
如下图(使用不同的请求方式可以获取对应的结果)
这里测试了service1的接口没问题,能正常访问。
这里就是服务接口的调用者了,在service2中去调用service1中的接口
需要在service2的pom中配置feign所需的依赖
然后创建接口和请求控制类
包结构如下,多了一个接口和一个请求控制类
具体操作如下
在service2的pom中添加feign的依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
Service2Service.java
package com.service2.service;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
/**
* @ClassDescription: 使用feign的接口 调用service1服务的接口
* Feign的使用,在接口上加上@FeignClient注解,
* 参数value为被调用接口所在的服务的实例名,这里即service1的配置文件中spring.application.name的值,
* path的值为被调用接口的路由前缀,即接口类上的路由
* 每个接口方法上的注解对应被调用接口的请求控制对用的注解
* @Author:李白
* @Date:2023/5/31 18:33
*/
@FeignClient(value = "Service1-app", path = "/crud")
public interface Service2Service {
@PostMapping
String addInfo();
@DeleteMapping
String removeInfo();
@PutMapping
String changeInfo();
@GetMapping
String searchInfo();
}
注:在接口上添加@FeignClient注解来使用这个组件进行接口调用
value的值为被调用服务的实例名,也就是它配置文件中的spring.application.name参数的值
path的值为被调用接口请求控制类上的路由前缀,这里指的就是crud
这里说的crud就是service1中的Service1Controller类上@RequestMapping括号里的值
Service2Controller.java
package com.service2.controller;
import com.service2.service.Service2Service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
/**
* @ClassDescription: 请求控制类(service2)
* @Author:李白
* @Date:2023/5/31 18:42
*/
@RestController
@RequestMapping("/caller")
public class Service2Controller {
@Autowired
Service2Service service2Service;
@PostMapping
public String addInfo(){
return service2Service.addInfo();
}
@DeleteMapping
public String remove(){
return service2Service.removeInfo();
}
@PutMapping
public String change(){
return service2Service.changeInfo();
}
@GetMapping
public String search(){
return service2Service.searchInfo();
}
}
在service2的启动类上加@EnableFeignClients注解开启feign
启动类Service2Application.java
package com.service2;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.cloud.openfeign.EnableFeignClients;
/**
* @ClassDescription: 服务2启动项
* 注解@EnableFeignClients开启feign功能,也可以添加参数,basePackages的值可指定使用该功能的接口所在包,
* 会对指定的包进行扫描包中带有feign注解的接口
* @Author:李白
* @Date:2023/5/31 14:51
*/
@EnableEurekaClient
@SpringBootApplication
//@EnableFeignClients(basePackages = "com.service2.service")
@EnableFeignClients
public class Service2Application {
public static void main(String[] args) {
SpringApplication.run(Service2Application.class, args);
}
}
依次启动eureka服务,service1服务,service2服务
使用postman进行接口调用
http://localhost:8003/caller
对于远程调用的接口含有对象传参情况,有两种方式处理
到此spring cloud整合feign功能就完成了,可以将其应用在需要的服务中。