山东大学软件学院项目实训——V-Track:虚拟现实环境下的远程教育和智能评估系统(九)

项目记录——week10/11/12/13

由于本项目采用的是微服务架构,而以前的前后端开发框架没有将服务进行拆分,所以在项目开发过程中遇到一些问题

本篇文章将简单介绍一下微服务架构、开发中遇到的问题以及如何进行解决的

一、微服务架构

微服务架构是一种软件开发方法,将应用程序分解为一组小的、独立的服务,每个服务运行在自己的进程中,并通过轻量级协议(通常是HTTP)相互通信。微服务架构强调服务的独立部署、开发和维护,使得开发团队能够更灵活地处理复杂的大型应用程序。

微服务架构的核心原则

  1. 服务自治:每个微服务独立开发、部署和运行,具有独立的数据库或数据存储。
  2. 专注单一职责:每个微服务只负责一个特定的业务功能或领域。
  3. 轻量级通信:服务间通过轻量级协议(如HTTP/REST、gRPC等)进行通信。
  4. 分布式管理:服务的管理、部署、监控和扩展是分布式的。
  5. 弹性和容错:系统具有高可用性和容错能力,服务之间的故障隔离能够防止单点故障。
  6. 技术异构性:允许不同服务使用不同的技术栈和编程语言。

微服务架构的主要组件

  1. API网关:作为所有客户端请求的入口,负责请求路由、协议转换、安全认证等。
  2. 服务注册与发现:服务注册中心记录所有可用的服务实例,服务发现机制帮助服务动态查找和连接其他服务。
  3. 负载均衡:分发请求到多个服务实例,提高系统的可用性和性能。
  4. 配置管理:集中管理和分发服务配置,确保配置的一致性和版本管理。
  5. 服务间通信:提供可靠的通信机制,如同步的HTTP/REST、异步的消息队列等。
  6. 日志和监控:收集和分析服务的运行日志,监控服务的健康状态和性能指标。
  7. 容器化和编排:使用容器技术(如Docker)和编排工具(如Kubernetes)进行服务的部署和管理。

微服务架构的优缺点

优点
  1. 提高开发效率:独立开发和部署,加快了开发周期和发布频率。
  2. 灵活性:不同服务可以使用最适合其需求的技术栈和工具。
  3. 可扩展性:独立扩展各个服务,满足不同的性能需求。
  4. 容错性:单个服务的故障不会影响整个系统,增强了系统的可靠性。
  5. 易于维护:服务职责单一,代码库较小,易于理解和维护。
缺点
  1. 复杂性增加:需要管理更多的服务和接口,增加了系统的复杂性。
  2. 分布式系统挑战:服务间通信、数据一致性、分布式事务等问题需要解决。
  3. 部署和运维难度:需要成熟的自动化部署、监控和故障排除机制。
  4. 性能开销:服务间通信的开销可能影响系统性能。

微服务架构的实施步骤

  1. 确定业务边界:识别和定义微服务的业务功能和边界。
  2. 选择技术栈:根据服务的需求选择合适的技术栈和工具。
  3. 设计服务接口:定义清晰的服务接口和通信协议。
  4. 实现服务自治:确保每个服务独立开发、部署和运行。
  5. 建立基础设施:构建服务注册与发现、配置管理、日志和监控等基础设施。
  6. 自动化部署:使用容器化技术和编排工具实现自动化部署和扩展。
  7. 持续集成和交付:实现CI/CD流程,确保代码的持续集成和快速交付。
  8. 监控和运维:建立全面的监控和报警机制,确保系统的健康运行。

 二、项目开发过程中的问题

最初遇到问题就是不同服务之间的方法无法互相调用,这个问题也不难解决,但是会让代码变得很复杂,容易出错且不好管理,总结起来就是以下几点:

1、缺乏统一的负载均衡和服务发现机制,无法自动负载均衡

使用 RestTemplate 或其他手动 HTTP 客户端时,需要额外配置和实现负载均衡。否则,只能手动指定具体的服务实例,无法动态选择服务实例。

2、代码冗长且分散

手动 HTTP 调用逻辑会散落在各个服务中,代码风格不一致,容易出错,增加了维护成本。

3、缺乏统一的日志和监控

每个手动实现的 HTTP 请求需要单独处理日志记录和监控,难以统一管理和分析。

三、解决方法——Feign

Feign 是一种声明式的 HTTP 客户端,常用于微服务架构中服务之间的通信。在 Spring Cloud 生态系统中,Feign 是一个强大的工具,它使得微服务之间的调用变得更加简单和优雅。

Feign 的作用

Feign 通过声明式的方式,使得调用其他微服务的 HTTP 接口变得像调用本地方法一样简单。它隐藏了底层的 HTTP 请求处理逻辑,使开发者无需关心底层的 HTTP 细节。Feign 支持负载均衡、熔断和降级等功能,结合 Spring Cloud 组件可以提供更强大的服务调用能力。

Feign 的主要特性

  1. 声明式 HTTP 客户端:通过接口和注解定义 HTTP 请求。
  2. 负载均衡:与 Ribbon 结合,可以实现客户端的负载均衡。
  3. 熔断和降级:与 Hystrix 结合,实现服务的熔断和降级处理。
  4. 简洁的编码风格:通过注解配置 HTTP 请求,代码简洁明了。
  5. 可扩展性:支持自定义编码器、解码器、错误处理等。

如何使用 Feign

1. 添加依赖

pom.xml 中添加 Feign 的依赖

        <dependency>
            <groupId>com.roncoo</groupId>
            <artifactId>roncoo-education-feign-system</artifactId>
        </dependency>
        <dependency>
            <groupId>com.roncoo</groupId>
            <artifactId>roncoo-education-feign-user</artifactId>
        </dependency>
        <dependency>
            <groupId>com.roncoo</groupId>
            <artifactId>roncoo-education-feign-course</artifactId>
        </dependency>
2. 启用 Feign 客户端

在 Spring Boot 应用的主类上添加 @EnableFeignClients 注解:

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.ServletComponentScan;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients;


@EnableFeignClients
@ServletComponentScan
@EnableDiscoveryClient
@SpringBootApplication
public class SystemServiceApplication {

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

}
3. 定义 Feign 客户端接口

创建一个接口,通过注解定义 HTTP 请求:

import com.roncoo.education.system.feign.interfaces.vo.SysUserVo;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;

@FeignClient(value = "service-system", path = "/system/sys/user")
public interface IFeignSysUser {

    @PostMapping(value = "/getById")
    SysUserVo getById(@RequestBody Long id);

}

其中,@FeignClient 注解指定了要调用的微服务名称和路径,@GetMapping 注解指定了具体的 HTTP 请求路径。

4. 使用 Feign 客户端

在服务中注入 Feign 客户端,并调用其方法:

import com.roncoo.education.common.service.BaseController;
import com.roncoo.education.system.feign.biz.FeignSysUserBiz;
import com.roncoo.education.system.feign.interfaces.IFeignSysUser;
import com.roncoo.education.system.feign.interfaces.vo.SysUserVo;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.validation.constraints.NotNull;

@RestController
@RequiredArgsConstructor
@RequestMapping("/system/sys/user")
public class FeignSysUserController extends BaseController implements IFeignSysUser {

    @NotNull
    private final FeignSysUserBiz biz;

    @Override
    public SysUserVo getById(@RequestBody Long id) { return biz.getById(id); }
}

通过上述步骤,FeignSysUserBiz 就像调用本地方法一样调用远程 service-system微服务的接口。

Feign 的高级功能

  1. 参数传递:支持 URL 参数、请求体、请求头等多种参数传递方式。
  2. 文件上传下载:支持文件的上传和下载。
  3. 自定义配置:支持自定义编码器、解码器、错误处理、日志级别等。
  4. Hystrix 熔断:与 Hystrix 结合,实现服务的熔断和降级处理。

例如,使用 Hystrix 实现熔断和降级处理:

@FeignClient(name = "user-service", fallback = UserClientFallback.class)
public interface UserClient {
    @GetMapping("/users/{id}")
    User getUserById(@PathVariable("id") Long id);
}

@Component
public class UserClientFallback implements UserClient {
    @Override
    public User getUserById(Long id) {
        // 返回默认的用户信息
        return new User();
    }
}

通过配置 fallback 属性指定熔断后的降级处理类 UserClientFallback,在服务不可用时返回默认的用户信息。

总结

Feign 是 Spring Cloud 生态系统中用于微服务之间通信的重要组件。它通过声明式的方式简化了 HTTP 请求的处理,使开发者能够更加专注于业务逻辑的实现。结合其他 Spring Cloud 组件,Feign 提供了强大的服务调用、负载均衡、熔断和降级等功能,是构建微服务架构的理想选择。

  • 27
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值