微服务技术系列教程(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

目录
相关文章
|
2月前
|
Kubernetes Cloud Native 微服务
探索云原生技术:容器化与微服务架构的融合之旅
本文将带领读者深入了解云原生技术的核心概念,特别是容器化和微服务架构如何相辅相成,共同构建现代软件系统。我们将通过实际代码示例,探讨如何在云平台上部署和管理微服务,以及如何使用容器编排工具来自动化这一过程。文章旨在为开发者和技术决策者提供实用的指导,帮助他们在云原生时代中更好地设计、部署和维护应用。
|
3月前
|
运维 Kubernetes Cloud Native
云原生技术:容器化与微服务架构的完美结合
【10月更文挑战第37天】在数字化转型的浪潮中,云原生技术以其灵活性和高效性成为企业的新宠。本文将深入探讨云原生的核心概念,包括容器化技术和微服务架构,以及它们如何共同推动现代应用的发展。我们将通过实际代码示例,展示如何在Kubernetes集群上部署一个简单的微服务,揭示云原生技术的强大能力和未来潜力。
|
3月前
|
运维 持续交付 API
从零构建微服务架构:一次深度技术探索之旅####
【10月更文挑战第28天】 本文记录了作者在从零开始构建微服务架构过程中的深刻技术感悟,通过实战案例详细剖析了微服务设计、开发、部署及运维中的关键要点与挑战。文章首先概述了微服务架构的核心理念及其对企业IT架构转型的重要性,随后深入探讨了服务拆分策略、API网关选型、服务间通信协议选择、容器化部署(Docker+Kubernetes)、以及持续集成/持续部署(CI/CD)流程的设计与优化。最后,分享了在高并发场景下的性能调优经验与故障排查心得,旨在为读者提供一套可借鉴的微服务架构实施路径。 ####
94 3
|
2月前
|
SpringCloudAlibaba JavaScript Dubbo
【SpringCloud Alibaba系列】Dubbo dubbo-admin安装教程篇
本文介绍了 Dubbo-Admin 的安装和使用步骤。Dubbo-Admin 是一个前后端分离的项目,前端基于 Vue,后端基于 Spring Boot。安装前需确保开发环境(Windows 10)已安装 JDK、Maven 和 Node.js,并在 Linux CentOS 7 上部署 Zookeeper 作为注册中心。
【SpringCloud Alibaba系列】Dubbo dubbo-admin安装教程篇
|
1月前
|
监控 JavaScript 数据可视化
建筑施工一体化信息管理平台源码,支持微服务架构,采用Java、Spring Cloud、Vue等技术开发。
智慧工地云平台是专为建筑施工领域打造的一体化信息管理平台,利用大数据、云计算、物联网等技术,实现施工区域各系统数据汇总与可视化管理。平台涵盖人员、设备、物料、环境等关键因素的实时监控与数据分析,提供远程指挥、决策支持等功能,提升工作效率,促进产业信息化发展。系统由PC端、APP移动端及项目、监管、数据屏三大平台组成,支持微服务架构,采用Java、Spring Cloud、Vue等技术开发。
|
3月前
|
Kubernetes Java 微服务
微服务上下线动态感知实现的技术解析
随着微服务架构的广泛应用,服务的动态管理和监控变得尤为重要。在微服务架构中,服务的上下线是一个常见的操作,如何实时感知这些变化,确保系统的稳定性和可靠性,成为了一个关键技术挑战。本文将深入探讨微服务上下线动态感知的实现方式,从技术基础、场景案例、解决思路和底层原理等多个维度进行阐述,并分别使用Java和Python进行演示介绍。
92 4
|
3月前
|
运维 Kubernetes Docker
深入理解容器化技术及其在微服务架构中的应用
深入理解容器化技术及其在微服务架构中的应用
108 1
|
3月前
|
监控 Java 微服务
从零构建微服务架构:一次深度技术探索之旅####
本文作为一篇深度技术分享,引领读者踏上自底向上搭建微服务架构的征途,旨在通过实战经验剖析,揭示微服务转型背后的技术挑战与解决方案。不同于常规摘要仅概述内容,本文摘要将直接以故事化手法,简述作者从单体应用困境出发,逐步迈向微服务化的心路历程,涵盖关键决策点、技术选型考量及实践收获,激发读者对微服务架构设计与实现的浓厚兴趣。 ####
|
3月前
|
Cloud Native 云计算 Docker
云原生技术的崛起:从容器化到微服务架构
云原生技术的崛起:从容器化到微服务架构
|
3月前
|
监控 API 微服务
后端技术演进:从单体架构到微服务的转变
随着互联网应用的快速增长和用户需求的不断演化,传统单体架构已难以满足现代软件开发的需求。本文深入探讨了后端技术在面对复杂系统挑战时的演进路径,重点分析了从单体架构向微服务架构转变的过程、原因及优势。通过对比分析,揭示了微服务架构如何提高系统的可扩展性、灵活性和维护效率,同时指出了实施微服务时面临的挑战和最佳实践。
89 7

热门文章

最新文章