一文读懂spring cloud 服务调用原理与实践(Feign实现)

Spring Cloud微服务架构概览

Spring Cloud是一套基于Spring Boot构建的微服务生态体系,旨在简化分布式系统中的开发复杂度。它提供了一系列工具和服务来帮助开发者快速搭建、配置以及管理基于微服务架构的应用程序。通过利用Spring Cloud提供的各种组件如服务发现、配置中心、断路器等,开发团队能够有效地提高应用程序的可扩展性、容错能力和安全性。比如,在一个Web或App应用中采用Spring Cloud进行服务化改造后,可以将单个庞大的应用拆分成多个小型的服务,每个服务负责处理特定的业务逻辑。这样做不仅增强了系统的灵活性,也便于不同团队成员专注于自己负责的服务模块上,从而加快了开发速度和提高了协作效率。此外,当某个服务出现问题时,不会影响到整个应用,因为其他服务仍然可以通过Spring Cloud提供的服务调用机制正常运行。这种解耦合的设计使得维护和更新变得更容易,同时也促进了持续集成与部署实践的实施。例如,若有一个电商网站使用Spring Cloud实现其订单处理系统,则该系统可能会被拆分为用户管理、商品展示、购物车管理等多个独立但又相互联系的服务,各服务间通过Spring Cloud支持的服务注册与发现机制自动找到对方并完成必要的交互。

Spring Cloud 本地化最佳实践:Spring Cloud Alibaba

spring cloud alibaba是Spring Cloud目前最佳的本地化实践之一,它结合了阿里在Java应用开发领域的经验和实践,在国内的用户体量也比较大。主要包括以下组件,在实战篇我们主要用Spring Cloud Alibaba的组件来实操。

  • Nacos:作为服务发现与配置中心,支持动态配置管理和服务注册。
  • SchedulerX:用于执行分布式定时任务,确保任务按时准确触发。
  • Seata:处理分布式事务,保证跨服务操作的一致性。
  • Sentinel:提供流量控制、熔断降级等功能,增强系统的稳定性和容错能力。
  • RocketMQ:一个高性能的消息中间件,适用于异步通信及消息队列场景。
  • Dubbo:用于构建大规模微服务架构中的RPC(远程过程调用)服务。
  • GraalVM:支持静态编译,提高应用程序性能并减少启动时间。
  • iLogtail:提供日志收集和分析功能,帮助监控和诊断系统问题。

这些组件共同构成了一个强大的工具集,极大地简化了基于Spring Cloud的微服务应用开发流程。

Nacos与Spring Cloud Alibaba远程服务调用实战

使用 Nacos 和 Spring Cloud Alibaba 实现远程服务调用

为了演示如何使用 Nacos 和 Spring Cloud Alibaba 来实现一次完整的远程服务调用,我们将按照以下步骤进行操作:

  1. 创建服务提供者:这个服务将被注册到 Nacos 服务器,并对外暴露一个简单的 REST 接口。
  2. 创建服务消费者:通过 Nacos 发现服务并消费服务提供者的 API。
  3. 配置和启动 Nacos 服务器
准备工作

确保您的开发环境中已经安装了以下软件:

  • Java JDK 8 或更高版本
  • Maven 3.x
  • Nacos Server(本例中使用本地安装的版本)

Nacos 的安装与启动可以参考 官方文档。简要说明如下:

# 下载Nacos
wget https://github.com/alibaba/nacos/releases/download/2.1.0/nacos-server-2.1.0.tar.gz
tar -xvf nacos-server-2.1.0.tar.gz -C /opt/
cd /opt/nacos/bin

# 启动Nacos
sh startup.sh -m standalone
服务提供者

我们首先创建一个名为 service-provider 的服务,该服务将在 Nacos 中注册,并提供一个简单的 REST API。

POM.xml 配置

pom.xml 文件中添加必要的依赖:

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        <version>2.2.3.RELEASE</version>
    </dependency>
</dependencies>

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>Hoxton.SR12</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-alibaba-dependencies</artifactId>
            <version>2.2.3.RELEASE</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>
应用配置

src/main/resources/application.properties 中添加 Nacos 服务发现相关的配置:

spring.application.name=service-provider
server.port=18082
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
主类和服务接口

定义一个主应用类以及一个简单的 REST 控制器:

package com.example.provider;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;

@SpringBootApplication
@EnableDiscoveryClient
public class ServiceProviderApplication {

    public static void main(String[] args) {
        SpringApplication.run(ServiceProviderApplication.class, args);
    }

    @RestController
    public class EchoController {
        @GetMapping("/echo/{string}")
        public String echo(@PathVariable String string) {
            return "Hello, " + string + " from Service Provider!";
        }
    }
}
服务消费者

接下来,我们将创建一个名为 service-consumer 的应用,它会通过 Nacos 发现 service-provider 并调用其提供的 API。

POM.xml 配置

同样地,在消费者的 pom.xml 文件中加入类似的依赖:

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        <version>2.2.3.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-openfeign</artifactId>
    </dependency>
</dependencies>

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>Hoxton.SR12</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-alibaba-dependencies</artifactId>
            <version>2.2.3.RELEASE</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>
应用配置

设置 application.properties 以匹配服务消费者的基本信息及 Nacos 连接详情:

spring.application.name=service-consumer
server.port=18083
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
定义 Feign Client

利用 OpenFeign 创建一个客户端代理来访问远端的服务:

package com.example.consumer;

import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;

@FeignClient(name = "service-provider")
public interface EchoService {
    @GetMapping("/echo/{str}")
    String echo(@PathVariable("str") String str);
}
主类与控制器

最后,在消费者应用程序里注入之前定义的 Feign Client,并构建一个控制器来测试调用逻辑:

package com.example.consumer;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;

@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
public class ServiceConsumerApplication {

    public static void main(String[] args) {
        SpringApplication.run(ServiceConsumerApplication.class, args);
    }

    @RestController
    public class TestController {
        @Autowired
        private EchoService echoService;

        @GetMapping("/call-remote/{str}")
        public String callRemote(@PathVariable String str) {
            return echoService.echo(str);
        }
    }
}

到这里,你已成功搭建了一个基于 Spring Cloud Alibaba 和 Nacos 的微服务架构示例,其中包含了一个服务提供者和一个服务消费者。现在可以通过启动两个服务并通过浏览器或命令行工具如 curl 访问 http://localhost:18083/call-remote/test 来验证是否能够正确地从消费者向提供者发起请求并获得响应。

Nacos服务的搭建与配置

Nacos server的安装和部署

nacos是远程服务调用这个样例中最重要的前置条件,如果你想简化下载和部署的流程,Nacos Server作为服务发现的重要核心组件,可以通过阿里云上的MSE(微服务引擎)进行免费试用。以下是详细的步骤来完成Nacos Server在云上的安装与部署。

第一步:准备环境和资源
  1. 准备专有网络VPC和交换机

    • 如果已有适用的VPC和交换机,并且您的微服务应用已经在此VPC内部署,则直接使用现有资源。
    • 若需新建,请参考创建和管理专有网络指南操作。
  2. 开通微服务引擎注册配置 MSE Nacos

    1. 访问阿里云免费试用页面并登录您的账号。
    2. 在产品列表中找到中间件 > 微服务引擎下的“注册配置 MSE Nacos/ZooKeeper”,点击“立即试用”。
    3. 根据需求填写配置信息,如选择Nacos作为引擎类型、自定义实例名称等。对于网络类型的选择依据如下:
      • 应用位于VPC内时选择“专有网络”;
      • 公网环境下选“公网网络”;
      • 如两者皆需连接,则选择“专有网络”并设置1 Mbps带宽以支持公网访问。
    4. 确认所有设置后勾选服务协议,点击“立即试用”提交申请。
    5. 成功提交后,前往MSE控制台实例列表,等待约3到5分钟直至实例状态变为“运行中”。
第二步:将微服务应用部署及注册至MSE Nacos
  1. 登录MSE控制台,从实例列表获取Nacos实例的具体访问地址。
  2. 更新您的Spring Cloud或Dubbo项目中的配置文件,指向该Nacos服务器地址。例如,对于Spring Cloud应用,在application.properties里添加:
    spring.cloud.nacos.discovery.server-addr=mse.XX.nacos.mse.aliyuncs.com:8848
    
    对于Dubbo项目,修改相应的XML配置:
    <dubbo:registry address="nacos://mse.XX.nacos.mse.aliyuncs.com:8848" />
    
  3. 重启您的微服务应用以便应用新的配置。
第三步:验证Nacos配置和服务发现功能
  1. 使用curl或其他工具测试配置是否已成功加载。例如,请求http://127.0.0.1:18084/nacos/bean(假设这是您的服务端口),查看返回结果确认Nacos配置中心的数据已被正确读取。
  2. 测试动态刷新特性,通过更改Nacos中的某个配置项值后再次发起上述请求,确保应用能够实时反映最新的配置变更。

以上就是spring cloud 服务调用原理与实践,希望对你能有些帮助。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值