微服务技术系列教程(23) - SpringCloud- 声明式服务调用Feign

简介: 微服务技术系列教程(23) - SpringCloud- 声明式服务调用Feign

1. 引言

代码已上传至Github,有兴趣的同学可以下载来看看:https://github.com/ylw-github/SpringCloud-Feign-Demo

Feign客户端是一个web声明式HTTP远程调用工具,提供了接口和注解方式进行调用。简单的说就是A工程如果知道B工程的接口,不需要知道它的具体实现就可以调用了,类似controller调用service。Spring Cloud集成了Ribbon和Eureka,可在使用Feign时提供负载均衡的http客户端。

2. 环境搭建

需求:订单工程需要调用会员工程的接口,但是订单工程不能知道会员工程的真实ip地址。

1. 新建Eureka注册中心项目、订单项目、会员项目

2.订单项目和会员工程都需要添加Feign依赖

<dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

3.订单项目和会员工程项目启动加上@EnableFeignClients

订单项目:------------------------------------------------------
@SpringBootApplication
@EnableEurekaClient
@EnableFeignClients
@EnableHystrix
public class AppOrder {
  public static void main(String[] args) {
    SpringApplication.run(AppOrder.class, args);
  }
}
会员项目:------------------------------------------------------
@SpringBootApplication
@EnableEurekaClient
@EnableFeignClients
public class AppMember {
  public static void main(String[] args) {
    SpringApplication.run(AppMember.class, args);
  }
}

4.会员工程定义接口

定义接口:---------------------------------------------------------
public interface IMemberService {
  // 实体类是存放接口项目还是 存放在实现项目 实体类存放在接口项目里面
  // 实体类和定义接口信息存放在接口项目
  // 代码实现存放在接口实现类里面
  @RequestMapping("/getMem")
  public UserEntity getMem(@RequestParam("name") String name);
}
接口实现:---------------------------------------------------------
@RestController
public class MemberServiceImpl extends BaseApiService implements IMemberService {
  @Value("${server.port}")
  private String serverPort;
  @Override
  public UserEntity getMem(String name) {
    UserEntity userEntity = new UserEntity();
    userEntity.setName(name + "serverPort:" + serverPort);
    userEntity.setAge(20);
    return userEntity;
  }
}

5.订单工程定义Feign客户端接口

public interface IMemberService {
  // 实体类是存放接口项目还是 存放在实现项目 实体类存放在接口项目里面
  // 实体类和定义接口信息存放在接口项目
  // 代码实现存放在接口实现类里面
  @RequestMapping("/getMem")
  public UserEntity getMem(@RequestParam("name") String name);
}
@FeignClient(name = "app-service-member")
public interface MemberServiceFeigin extends IMemberService {
  // 服务降级 熔断
  // 实体类是存放接口项目还是 存放在实现项目 实体类存放在接口项目里面
  // 实体类和定义接口信息存放在接口项目
  // 代码实现存放在接口实现类里面
}

6.订单工程调用会员工程接口

定义接口:---------------------------------------------------------
public interface IOrderService {
  @RequestMapping("/getOrderMember")
  public ResponseBase getOrderMember(String name);
}
接口实现:---------------------------------------------------------
@RestController
public class OrderServiceImpl extends BaseApiService implements IOrderService {
  // 订单服务继承会员服务接口,用来实现feign客户端 减少重复接口代码
  @Autowired
  private MemberServiceFeigin memberServiceFeigin;
  @RequestMapping("/getOrderMember")
  public ResponseBase getOrderMember(String name) {
    System.out.println("name:" + name);
    UserEntity user = memberServiceFeigin.getMem(name);
    if (user == null) {
      return setResultError("没有查询到用户信息");
    }
    return setResultSuccess(user);
  }
}

7.启动Eureka注册中心、会员工程、订单工程

8.浏览器访问:http://localhost:8020/getOrderMember?name=ylw

成功!!!

3. feign继承特性

在使用声明式feign客户端工具的时候,因为书写的方式代码可能会产生重复,可以使用feign客户端集成方式减少代码。

订单项目项目结构:

parent maven依赖:

<parent>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-parent</artifactId>
  <version>2.0.1.RELEASE</version>
</parent>
<!-- 管理依赖 -->
<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>
  <!-- SpringBoot整合fegnin客户端 -->
  <dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
  </dependency>
  <dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
  </dependency>
  <!-- hystrix断路器 -->
  <dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-hystrix</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>

application.yml:

###服务启动端口号
server:
  port: 8020
  tomcat:
    max-threads: 10
###服务名称(服务注册到eureka名称)  
spring:
    application:
        name: app-service-order
###服务注册到eureka地址
eureka:
  client:
    service-url:
           defaultZone: http://localhost:8100/eureka      
    ###因为该应用为注册中心,不会注册自己
    register-with-eureka: true
    ###是否需要从eureka上获取注册信息
    fetch-registry: true

4. Ribbon配置

SpringCloud Feign客户端Http调用工具,默认已经整合了Ribbon负载均衡客户端。

配置Feign客户端超时时间:

###设置feign客户端超时时间
ribbon:
###指的是建立连接所用的时间,适用于网络状况正常的情况下,两端连接所用的时间。
 ReadTimeout: 5000
###指的是建立连接后从服务器读取到可用资源所用的时间。 
 ConnectTimeout: 5000

测试:

1.拷贝会员工程,命名为Member-Service-Copy,并导入

2.修改端口号为:8011

###服务启动端口号
server:
  port: 8011
  tomcat:
    max-threads: 10
###服务名称(服务注册到eureka名称)  
spring:
    application:
        name: app-service-member
###服务注册到eureka地址
eureka:
  client:
    service-url:
           defaultZone: http://localhost:8100/eureka

3.修改Service类返回的内容:

@RestController
public class MemberServiceImpl extends BaseApiService implements IMemberService {
  @Value("${server.port}")
  private String serverPort;
  @Override
  public UserEntity getMem(String name) {
    UserEntity userEntity = new UserEntity();
    userEntity.setName("copy -------------> "+name + "serverPort:" + serverPort);
    userEntity.setAge(20);
    return userEntity;
  }
}

4.启动Eureka注册工程、会员工程(两个)、订单工程:

5.浏览器访问:http://localhost:8020/getOrderMember?name=ylw

再次请求,可以看出两个订单工程被轮询访问了:

5. 总结

代码已上传至Github,有兴趣的同学可以下载来看看:https://github.com/ylw-github/SpringCloud-Feign-Demo

目录
相关文章
|
9天前
|
运维 Kubernetes Cloud Native
云原生技术:容器化与微服务架构的完美结合
【10月更文挑战第37天】在数字化转型的浪潮中,云原生技术以其灵活性和高效性成为企业的新宠。本文将深入探讨云原生的核心概念,包括容器化技术和微服务架构,以及它们如何共同推动现代应用的发展。我们将通过实际代码示例,展示如何在Kubernetes集群上部署一个简单的微服务,揭示云原生技术的强大能力和未来潜力。
|
17天前
|
运维 持续交付 API
从零构建微服务架构:一次深度技术探索之旅####
【10月更文挑战第28天】 本文记录了作者在从零开始构建微服务架构过程中的深刻技术感悟,通过实战案例详细剖析了微服务设计、开发、部署及运维中的关键要点与挑战。文章首先概述了微服务架构的核心理念及其对企业IT架构转型的重要性,随后深入探讨了服务拆分策略、API网关选型、服务间通信协议选择、容器化部署(Docker+Kubernetes)、以及持续集成/持续部署(CI/CD)流程的设计与优化。最后,分享了在高并发场景下的性能调优经验与故障排查心得,旨在为读者提供一套可借鉴的微服务架构实施路径。 ####
55 3
|
1月前
|
Dubbo Java 应用服务中间件
Spring Cloud Dubbo:微服务通信的高效解决方案
【10月更文挑战第15天】随着信息技术的发展,微服务架构成为企业应用开发的主流。Spring Cloud Dubbo结合了Dubbo的高性能RPC和Spring Cloud的生态系统,提供高效、稳定的微服务通信解决方案。它支持多种通信协议,具备服务注册与发现、负载均衡及容错机制,简化了服务调用的复杂性,使开发者能更专注于业务逻辑的实现。
56 2
|
9天前
|
监控 API 微服务
后端技术演进:从单体架构到微服务的转变
随着互联网应用的快速增长和用户需求的不断演化,传统单体架构已难以满足现代软件开发的需求。本文深入探讨了后端技术在面对复杂系统挑战时的演进路径,重点分析了从单体架构向微服务架构转变的过程、原因及优势。通过对比分析,揭示了微服务架构如何提高系统的可扩展性、灵活性和维护效率,同时指出了实施微服务时面临的挑战和最佳实践。
28 7
|
10天前
|
Kubernetes Cloud Native Docker
云原生技术探索:容器化与微服务的实践之道
【10月更文挑战第36天】在云计算的浪潮中,云原生技术以其高效、灵活和可靠的特性成为企业数字化转型的重要推手。本文将深入探讨云原生的两大核心概念——容器化与微服务架构,并通过实际代码示例,揭示如何通过Docker和Kubernetes实现服务的快速部署和管理。我们将从基础概念入手,逐步引导读者理解并实践云原生技术,最终掌握如何构建和维护一个高效、可扩展的云原生应用。
|
1月前
|
JSON Java 数据格式
【微服务】SpringCloud之Feign远程调用
本文介绍了使用Feign作为HTTP客户端替代RestTemplate进行远程调用的优势及具体使用方法。Feign通过声明式接口简化了HTTP请求的发送,提高了代码的可读性和维护性。文章详细描述了Feign的搭建步骤,包括引入依赖、添加注解、编写FeignClient接口和调用代码,并提供了自定义配置的示例,如修改日志级别等。
80 1
|
1月前
|
Cloud Native API 持续交付
利用云原生技术优化微服务架构
【10月更文挑战第13天】云原生技术通过容器化、动态编排、服务网格和声明式API,优化了微服务架构的可伸缩性、可靠性和灵活性。本文介绍了云原生技术的核心概念、优势及实施步骤,探讨了其在自动扩展、CI/CD、服务发现和弹性设计等方面的应用,并提供了实战技巧。
|
28天前
|
运维 Kubernetes 开发者
构建高效后端服务:微服务架构与容器化技术的结合
【10月更文挑战第18天】 在数字化转型的浪潮中,企业对后端服务的要求日益提高,追求更高的效率、更强的可伸缩性和更易于维护的系统。本文将探讨微服务架构与容器化技术如何结合,以构建一个既灵活又高效的后端服务体系。通过分析当前后端服务面临的挑战,介绍微服务和容器化的基本概念,以及它们如何相互配合来优化后端服务的性能和管理。本文旨在为开发者提供一种实现后端服务现代化的方法,从而帮助企业在竞争激烈的市场中脱颖而出。
25 0
|
12天前
|
设计模式 Java API
微服务架构演变与架构设计深度解析
【11月更文挑战第14天】在当今的IT行业中,微服务架构已经成为构建大型、复杂系统的重要范式。本文将从微服务架构的背景、业务场景、功能点、底层原理、实战、设计模式等多个方面进行深度解析,并结合京东电商的案例,探讨微服务架构在实际应用中的实施与效果。
56 6
|
12天前
|
设计模式 Java API
微服务架构演变与架构设计深度解析
【11月更文挑战第14天】在当今的IT行业中,微服务架构已经成为构建大型、复杂系统的重要范式。本文将从微服务架构的背景、业务场景、功能点、底层原理、实战、设计模式等多个方面进行深度解析,并结合京东电商的案例,探讨微服务架构在实际应用中的实施与效果。
28 1