SpringCloud------聚合项目及Feign声明式服务调用以及调用时应注意的问题

Feign介绍

Feign客户端是一个web声明式http远程调用工具,提供了接口和注解方式进行调用。它的目的就是让Web Service调用更加简单。

下面就用一个简单的微服务项目说明

项目结构:聚合项目,子父工程

项目获取地址:https://github.com/XiaoFengSophia/springcloud2.0-lancoo-parents 

 该案例中的member服务和order服务都是注册在Eureka注册中心集群中,关于Eureka注册中心集群的使用请点击springboot+springcloud+eureka实现高可用注册中心了解详情!

 父工程pom.xml


 
 
  1. <!-- SpringCloud 管理依赖 -->
  2. <dependencyManagement>
  3. <dependencies>
  4. <dependency>
  5. <groupId>org.springframework.cloud </groupId>
  6. <artifactId>spring-cloud-dependencies </artifactId>
  7. <version>Finchley.M7 </version>
  8. <type>pom </type>
  9. <scope>import </scope>
  10. </dependency>
  11. </dependencies>
  12. </dependencyManagement>
  13. <dependencies>
  14. <!-- SpringBoot整合Web组件 -->
  15. <dependency>
  16. <groupId>org.springframework.boot </groupId>
  17. <artifactId>spring-boot-starter-web </artifactId>
  18. </dependency>
  19. <!-- SpringBoot整合eureka客户端 -->
  20. <dependency>
  21. <groupId>org.springframework.cloud </groupId>
  22. <artifactId>spring-cloud-starter-netflix-eureka-client </artifactId>
  23. </dependency>
  24. <dependency>
  25. <groupId>org.springframework.boot </groupId>
  26. <artifactId>spring-boot-starter </artifactId>
  27. </dependency>
  28. <!-- SpringBoot整合feign客户端 -->
  29. <dependency>
  30. <groupId>org.springframework.cloud </groupId>
  31. <artifactId>spring-cloud-starter-openfeign </artifactId>
  32. </dependency>
  33. </dependencies>
  34. <!-- 注意: 这里必须要添加, 否者各种依赖有问题 -->
  35. <repositories>
  36. <repository>
  37. <id>spring-milestones </id>
  38. <name>Spring Milestones </name>
  39. <url>https://repo.spring.io/libs-milestone </url>
  40. <snapshots>
  41. <enabled>false </enabled>
  42. </snapshots>
  43. </repository>
  44. </repositories>

springcloud2.0-lancoo-api-member-service  接口

 pom.xml(MemberService接口)


 
 
  1. <dependencies>
  2. <!-- 引入公共项目 -->
  3. <dependency>
  4. <groupId>lancoo </groupId>
  5. <artifactId>springccloud2.0-lancoo-common </artifactId>
  6. <version>0.0.1-SNAPSHOT </version>
  7. </dependency>
  8. </dependencies>

 IMemberService


 
 
  1. public interface IMemberService {
  2. @RequestMapping("/getMember")
  3. public UserEntity getMember( @RequestParam("name") String name); //这里必须加@RequestParam("name"),否则远程调用时参数为null
  4. @RequestMapping("/getUserInfo")
  5. public ResponseBase getUserInfo();
  6. }

UserEntity


 
 
  1. public class UserEntity {
  2. private String name;
  3. private Integer age;
  4. public String getName() {
  5. return name;
  6. }
  7. public void setName(String name) {
  8. this.name = name;
  9. }
  10. public Integer getAge() {
  11. return age;
  12. }
  13. public void setAge(Integer age) {
  14. this.age = age;
  15. }
  16. public UserEntity(String name, Integer age) {
  17. super();
  18. this.name = name;
  19. this.age = age;
  20. }
  21. public UserEntity() {
  22. super();
  23. // TODO Auto-generated constructor stub
  24. }
  25. @Override
  26. public String toString() {
  27. return "UserEntity [name=" + name + ", age=" + age + "]";
  28. }

 springcloud2.0-lancoo-api-member-service-impl    实现类

pom.xml 


 
 
  1. <!-- 引入member接口项目 -->
  2. <dependency>
  3. <groupId>lancoo </groupId>
  4. <artifactId>springcloud2.0-lancoo-api-member-service </artifactId>
  5. <version>0.0.1-SNAPSHOT </version>
  6. </dependency>

 application.yml


 
 
  1. #启动服务端口
  2. server: 
  3.   port: 8001
  4. #服务名称(服务注册到Eureka注册中心)
  5. spring:
  6.   application:
  7.     name: zxf-lancoo-member
  8. #服务注册到Eureka地址
  9. eureka:
  10.   client:
  11.     service-url:
  12.       defaultZone: http: //127.0.0.1:8100/eureka,http://127.0.0.1:8200/eureka
  13.      
  14. #因为是注册中心,不会自己注册
  15.     register-with-eureka: true
  16. #是否需要从eureka上获取注册信息
  17.     fetch-registry: true

MemberServiceImpl


 
 
  1. @RestController
  2. public class MemberServiceImpl extends BaseApiService implements IMemberService {
  3. @Autowired
  4. private LoadBalancerClient loadBalancerClient;
  5. @RequestMapping( "/getMember")
  6. public UserEntity getMember(@RequestParam("name")String name) { //这里必须加@RequestParam("name"),否则远程调用时参数为null
  7. // TODO Auto-generated method stub
  8. UserEntity userEntity = new UserEntity();
  9. userEntity.setName(name);
  10. userEntity.setAge( 20);
  11. return userEntity;
  12. }
  13. }

 AppMember   启动类


 
 
  1. @SpringBootApplication
  2. @EnableEurekaClient //开启Eureka客户端
  3. @EnableFeignClients //开启Feign客户端
  4. public class AppMember {
  5. public static void main(String[] args) {
  6. SpringApplication.run(AppMember.class, args);
  7. }
  8. }

 

 springcloud2.0-lancoo-api-order-service  接口

 

 pom.xml(OrderService)


 
 
  1. <!-- 引入公共项目 -->
  2. <dependency>
  3. <groupId>lancoo </groupId>
  4. <artifactId>springccloud2.0-lancoo-common </artifactId>
  5. <version>0.0.1-SNAPSHOT </version>
  6. </dependency>

IOrderService


 
 
  1. public interface IOrderService {
  2. //订单服务调用会员服务接口信息 feign
  3. @RequestMapping( "/orderToMember")
  4. public String orderToMember(String name);
  5. //订单服务调用会员服务接口
  6. @RequestMapping( "/orderToMemberUserInfo")
  7. public ResponseBase orderToMemberUserInfo();
  8. //订单服务调用会员服务接口
  9. @RequestMapping( "/orderInfo")
  10. public ResponseBase orderInfo();
  11. }

springcloud2.0-lancoo-api-order-service-impl   OrderService实现类

 pom.xml


 
 
  1. <!-- order接口项目 -->
  2. <dependency>
  3. <groupId>lancoo </groupId>
  4. <artifactId>springcloud2.0-lancoo-api-order-service </artifactId>
  5. <version>0.0.1-SNAPSHOT </version>
  6. </dependency>
  7. <!-- 引入member接口项目 -->
  8. <dependency>
  9. <groupId>lancoo </groupId>
  10. <artifactId>springcloud2.0-lancoo-api-member-service </artifactId>
  11. <version>0.0.1-SNAPSHOT </version>
  12. </dependency>

 application.yml


 
 
  1. #启动服务端口
  2. server:
  3. port: 8021
  4. #服务名称(服务注册到Eureka注册中心)
  5. spring:
  6. application:
  7. name: zxf-lancoo-order
  8. #服务注册到Eureka地址
  9. eureka:
  10. client:
  11. service-url:
  12. defaultZone: http: //localhost:8100/eureka
  13. #因为是注册中心,不会自己注册
  14. register-with-eureka: true
  15. #是否需要从eureka上获取注册信息
  16. fetch-registry: true
  17. ###设置feign客户端超时时间
  18. #springcloud feign默认开启支持ribbon
  19. ribbon:
  20. ###指的是建立连接所用的时间,适用于网络状况正常的情况下,两端连接所用的时间。
  21. ReadTimeout: 5000
  22. ###指的是建立连接后从服务器读取到可用资源所用的时间。
  23. ConnectTimeout: 5000

OrderServiceImpl


 
 
  1. @RestController
  2. public class OrderServiceImpl extends BaseApiService implements IOrderService {
  3. //订单服务继承会员服务接口,用来实现feign客户端的调用,减少重复代码接口
  4. @Autowired
  5. private IMemberServiceFeign iMemberServiceFeign;
  6. @RequestMapping( "/orderToMember")
  7. public String orderToMember(String name) {
  8. // TODO Auto-generated method stub
  9. UserEntity userEntity = iMemberServiceFeign.getMember(name);
  10. return userEntity== null? "未找到任何信息":userEntity.toString();
  11. }
  12. }

 IMemberServiceFeign


 
 
  1. /**
  2. * 继承的作用解决代码重复
  3. * 订单服务继承会员服务接口,实现feign客户端的调用
  4. * @author lancoo
  5. *
  6. */
  7. @FeignClient( "zxf-lancoo-member")
  8. public interface IMemberServiceFeign extends IMemberService {
  9. }

AppOrder


 
 
  1. @SpringBootApplication
  2. @EnableEurekaClient //Eureka客户端
  3. @EnableFeignClients //Feign客户端
  4. public class AppOrder {
  5. public static void main(String[] args) {
  6. SpringApplication.run(AppOrder.class, args);
  7. }
  8. }

公共子模块

BaseApiService


 
 
  1. @Component
  2. public class BaseApiService {
  3. public ResponseBase setResultError(Integer code,String msg) {
  4. return setResult(code, msg, null);
  5. }
  6. //返回错误,可以传msg
  7. public ResponseBase setResultError(String msg) {
  8. return setResult( 500,msg, null);
  9. }
  10. //返回成功,可以传data值
  11. public ResponseBase setResultSuccess(Object data) {
  12. return setResult( 200, "处理成功", data);
  13. }
  14. //返回成功,没有data值
  15. public ResponseBase setResultSuccess() {
  16. return setResult( 200, "处理成功", null);
  17. }
  18. //返回成功,没有data值
  19. public ResponseBase setResultSuccess(String msg) {
  20. return setResult( 200,msg, null);
  21. }
  22. //通用封装
  23. public ResponseBase setResult(Integer code,String msg,Object data) {
  24. return new ResponseBase(code,msg, data);
  25. }
  26. }

ResponseBase


 
 
  1. @Slf4j
  2. public class ResponseBase {
  3. private Integer rtnCode;
  4. private String msg;
  5. private Object data;
  6. public ResponseBase() {
  7. super();
  8. // TODO Auto-generated constructor stub
  9. }
  10. public ResponseBase(Integer rtnCode, String msg, Object data) {
  11. super();
  12. this.rtnCode = rtnCode;
  13. this.msg = msg;
  14. this. data = data;
  15. }
  16. public Integer getRtnCode() {
  17. return rtnCode;
  18. }
  19. public void setRtnCode(Integer rtnCode) {
  20. this.rtnCode = rtnCode;
  21. }
  22. public String getMsg() {
  23. return msg;
  24. }
  25. public void setMsg(String msg) {
  26. this.msg = msg;
  27. }
  28. public Object getData() {
  29. return data;
  30. }
  31. public void setData(Object data) {
  32. this. data = data;
  33. }
  34. @Override
  35. public String toString() {
  36. return "ResponseBase [rtnCode=" + rtnCode + ", msg=" + msg + ", data=" + data + "]";
  37. }
  38. }

访问member服务:http://127.0.0.1:8001/getMember?name=张三

order服务通过Feign客户端调用member   http://127.0.0.1:8021/orderToMember?name=张三

 解决方案在member服务的接口和接口的实现类相应方法的参数头加  @RequestParam("name")

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值