SpringCloud------聚合项目及Feign声明式服务调用以及调用时应注意的问题
程序员文章站
2024-02-03 21:17:40
...
Feign客户端是一个web声明式http远程调用工具,提供了接口和注解方式进行调用。它的目的就是让Web Service调用更加简单。
下面就用一个简单的微服务项目说明
项目结构:聚合项目,子父工程
项目获取地址:https://github.com/XiaoFengSophia/springcloud2.0-lancoo-parents
该案例中的member服务和order服务都是注册在Eureka注册中心集群中,关于Eureka注册中心集群的使用请点击springboot+springcloud+eureka实现高可用注册中心了解详情!
父工程pom.xml
-
<!-- SpringCloud 管理依赖 -->
-
<dependencyManagement>
-
<dependencies>
-
<dependency>
-
<groupId>org.springframework.cloud</groupId>
-
<artifactId>spring-cloud-dependencies</artifactId>
-
<version>Finchley.M7</version>
-
<type>pom</type>
-
<scope>import</scope>
-
</dependency>
-
</dependencies>
-
</dependencyManagement>
-
<dependencies>
-
<!-- SpringBoot整合Web组件 -->
-
<dependency>
-
<groupId>org.springframework.boot</groupId>
-
<artifactId>spring-boot-starter-web</artifactId>
-
</dependency>
-
<!-- SpringBoot整合eureka客户端 -->
-
<dependency>
-
<groupId>org.springframework.cloud</groupId>
-
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
-
</dependency>
-
-
<dependency>
-
<groupId>org.springframework.boot</groupId>
-
<artifactId>spring-boot-starter</artifactId>
-
</dependency>
-
<!-- SpringBoot整合feign客户端 -->
-
<dependency>
-
<groupId>org.springframework.cloud</groupId>
-
<artifactId>spring-cloud-starter-openfeign</artifactId>
-
</dependency>
-
-
</dependencies>
-
<!-- 注意: 这里必须要添加, 否者各种依赖有问题 -->
-
<repositories>
-
<repository>
-
<id>spring-milestones</id>
-
<name>Spring Milestones</name>
-
<url>https://repo.spring.io/libs-milestone</url>
-
<snapshots>
-
<enabled>false</enabled>
-
</snapshots>
-
</repository>
-
</repositories>
springcloud2.0-lancoo-api-member-service 接口
pom.xml(MemberService接口)
-
<dependencies>
-
<!-- 引入公共项目 -->
-
<dependency>
-
<groupId>lancoo</groupId>
-
<artifactId>springccloud2.0-lancoo-common</artifactId>
-
<version>0.0.1-SNAPSHOT</version>
-
</dependency>
-
</dependencies>
IMemberService
-
public interface IMemberService {
-
-
@RequestMapping("/getMember")
-
public UserEntity getMember(@RequestParam("name") String name);//这里必须加@RequestParam("name"),否则远程调用时参数为null
-
-
@RequestMapping("/getUserInfo")
-
public ResponseBase getUserInfo();
-
-
}
UserEntity
-
public class UserEntity {
-
-
private String name;
-
private Integer age;
-
public String getName() {
-
return name;
-
}
-
public void setName(String name) {
-
this.name = name;
-
}
-
public Integer getAge() {
-
return age;
-
}
-
public void setAge(Integer age) {
-
this.age = age;
-
}
-
public UserEntity(String name, Integer age) {
-
super();
-
this.name = name;
-
this.age = age;
-
}
-
public UserEntity() {
-
super();
-
// TODO Auto-generated constructor stub
-
}
-
@Override
-
public String toString() {
-
return "UserEntity [name=" + name + ", age=" + age + "]";
-
}
springcloud2.0-lancoo-api-member-service-impl 实现类
pom.xml
-
<!-- 引入member接口项目 -->
-
<dependency>
-
<groupId>lancoo</groupId>
-
<artifactId>springcloud2.0-lancoo-api-member-service</artifactId>
-
<version>0.0.1-SNAPSHOT</version>
-
</dependency>
application.yml
-
#启动服务端口
-
server:
-
port: 8001
-
#服务名称(服务注册到Eureka注册中心)
-
spring:
-
application:
-
name: zxf-lancoo-member
-
#服务注册到Eureka地址
-
eureka:
-
client:
-
service-url:
-
defaultZone: http://127.0.0.1:8100/eureka,http://127.0.0.1:8200/eureka
-
-
#因为是注册中心,不会自己注册
-
register-with-eureka: true
-
#是否需要从eureka上获取注册信息
-
fetch-registry: true
MemberServiceImpl
-
@RestController
-
public class MemberServiceImpl extends BaseApiService implements IMemberService {
-
@Autowired
-
private LoadBalancerClient loadBalancerClient;
-
-
@RequestMapping("/getMember")
-
public UserEntity getMember(@RequestParam("name")String name) {//这里必须加@RequestParam("name"),否则远程调用时参数为null
-
// TODO Auto-generated method stub
-
UserEntity userEntity = new UserEntity();
-
userEntity.setName(name);
-
userEntity.setAge(20);
-
return userEntity;
-
}
-
-
-
}
AppMember 启动类
-
@SpringBootApplication
-
@EnableEurekaClient //开启Eureka客户端
-
@EnableFeignClients //开启Feign客户端
-
public class AppMember {
-
-
public static void main(String[] args) {
-
SpringApplication.run(AppMember.class, args);
-
}
-
-
}
springcloud2.0-lancoo-api-order-service 接口
pom.xml(OrderService)
-
<!-- 引入公共项目 -->
-
<dependency>
-
<groupId>lancoo</groupId>
-
<artifactId>springccloud2.0-lancoo-common</artifactId>
-
<version>0.0.1-SNAPSHOT</version>
-
</dependency>
IOrderService
-
public interface IOrderService {
-
-
//订单服务调用会员服务接口信息 feign
-
@RequestMapping("/orderToMember")
-
public String orderToMember(String name);
-
-
//订单服务调用会员服务接口
-
@RequestMapping("/orderToMemberUserInfo")
-
public ResponseBase orderToMemberUserInfo();
-
-
//订单服务调用会员服务接口
-
@RequestMapping("/orderInfo")
-
public ResponseBase orderInfo();
-
-
-
}
springcloud2.0-lancoo-api-order-service-impl OrderService实现类
pom.xml
-
<!-- order接口项目 -->
-
<dependency>
-
<groupId>lancoo</groupId>
-
<artifactId>springcloud2.0-lancoo-api-order-service</artifactId>
-
<version>0.0.1-SNAPSHOT</version>
-
</dependency>
-
<!-- 引入member接口项目 -->
-
<dependency>
-
<groupId>lancoo</groupId>
-
<artifactId>springcloud2.0-lancoo-api-member-service</artifactId>
-
<version>0.0.1-SNAPSHOT</version>
-
</dependency>
application.yml
-
#启动服务端口
-
server:
-
port: 8021
-
#服务名称(服务注册到Eureka注册中心)
-
spring:
-
application:
-
name: zxf-lancoo-order
-
#服务注册到Eureka地址
-
eureka:
-
client:
-
service-url:
-
defaultZone: http://localhost:8100/eureka
-
-
#因为是注册中心,不会自己注册
-
register-with-eureka: true
-
#是否需要从eureka上获取注册信息
-
fetch-registry: true
-
-
###设置feign客户端超时时间
-
#springcloud feign默认开启支持ribbon
-
ribbon:
-
###指的是建立连接所用的时间,适用于网络状况正常的情况下,两端连接所用的时间。
-
ReadTimeout: 5000
-
###指的是建立连接后从服务器读取到可用资源所用的时间。
-
ConnectTimeout: 5000
OrderServiceImpl
-
@RestController
-
public class OrderServiceImpl extends BaseApiService implements IOrderService {
-
-
-
//订单服务继承会员服务接口,用来实现feign客户端的调用,减少重复代码接口
-
@Autowired
-
private IMemberServiceFeign iMemberServiceFeign;
-
-
@RequestMapping("/orderToMember")
-
public String orderToMember(String name) {
-
// TODO Auto-generated method stub
-
UserEntity userEntity = iMemberServiceFeign.getMember(name);
-
return userEntity==null?"未找到任何信息":userEntity.toString();
-
}
-
-
-
}
IMemberServiceFeign
-
/**
-
* 继承的作用解决代码重复
-
* 订单服务继承会员服务接口,实现feign客户端的调用
-
* @author lancoo
-
*
-
*/
-
@FeignClient("zxf-lancoo-member")
-
public interface IMemberServiceFeign extends IMemberService {
-
-
-
-
}
AppOrder
-
@SpringBootApplication
-
@EnableEurekaClient //Eureka客户端
-
@EnableFeignClients //Feign客户端
-
public class AppOrder {
-
-
public static void main(String[] args) {
-
SpringApplication.run(AppOrder.class, args);
-
}
-
-
}
公共子模块
BaseApiService
-
@Component
-
public class BaseApiService {
-
-
public ResponseBase setResultError(Integer code,String msg) {
-
-
return setResult(code, msg,null);
-
}
-
//返回错误,可以传msg
-
public ResponseBase setResultError(String msg) {
-
-
return setResult(500,msg,null);
-
}
-
//返回成功,可以传data值
-
public ResponseBase setResultSuccess(Object data) {
-
-
return setResult(200,"处理成功",data);
-
}
-
//返回成功,没有data值
-
public ResponseBase setResultSuccess() {
-
-
return setResult(200,"处理成功",null);
-
}
-
//返回成功,没有data值
-
public ResponseBase setResultSuccess(String msg) {
-
-
return setResult(200,msg,null);
-
}
-
//通用封装
-
public ResponseBase setResult(Integer code,String msg,Object data) {
-
-
return new ResponseBase(code,msg,data);
-
}
-
-
}
ResponseBase
-
@Slf4j
-
public class ResponseBase {
-
-
private Integer rtnCode;
-
private String msg;
-
private Object data;
-
public ResponseBase() {
-
super();
-
// TODO Auto-generated constructor stub
-
}
-
public ResponseBase(Integer rtnCode, String msg, Object data) {
-
super();
-
this.rtnCode = rtnCode;
-
this.msg = msg;
-
this.data = data;
-
}
-
public Integer getRtnCode() {
-
return rtnCode;
-
}
-
public void setRtnCode(Integer rtnCode) {
-
this.rtnCode = rtnCode;
-
}
-
public String getMsg() {
-
return msg;
-
}
-
public void setMsg(String msg) {
-
this.msg = msg;
-
}
-
public Object getData() {
-
return data;
-
}
-
public void setData(Object data) {
-
this.data = data;
-
}
-
@Override
-
public String toString() {
-
return "ResponseBase [rtnCode=" + rtnCode + ", msg=" + msg + ", data=" + data + "]";
-
}
-
-
-
-
}
访问member服务:http://127.0.0.1:8001/getMember?name=张三
order服务通过Feign客户端调用member http://127.0.0.1:8021/orderToMember?name=张三
解决方案在member服务的接口和接口的实现类相应方法的参数头加 @RequestParam("name")