问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

微服务架构与Spring Cloud:设计与治理

创作时间:
作者:
@小白创作中心

微服务架构与Spring Cloud:设计与治理

引用
CSDN
1.
https://blog.csdn.net/m0_60281842/article/details/139976384

微服务架构是当前软件开发领域的重要趋势,它通过将系统拆分为多个独立的服务,实现了更高的灵活性和可维护性。Spring Cloud作为基于Spring Boot的微服务框架,提供了丰富的组件和自动化配置,使得微服务开发变得更加简单。本文将从微服务架构的基本概念出发,详细介绍Spring Cloud在微服务开发中的具体应用。

微服务架构概述

单体架构

单体架构是将所有业务功能集中在一个项目中,最终打包成一个可部署单元。这种方式的优点在于架构简单,部署成本低。然而,它的缺点也很明显:耦合度高,这使得维护和扩展变得困难。

分布式架构

分布式架构通过将系统根据业务功能拆分成多个独立项目,每个项目作为一个独立的服务运行。这种方式的优点包括降低服务间的耦合度,有利于服务的升级和扩展。

微服务架构

微服务架构是分布式架构的一种形式,它通过更细致的服务拆分,实现了更高的灵活性和可维护性。微服务架构的关键特征包括:

  • 单一职责:每个服务只负责一项业务功能,避免业务逻辑的重复开发。
  • 面向服务:服务通过API对外提供功能,强调服务的可访问性。
  • 自治性:每个服务由独立的团队开发、维护,拥有自己的技术栈和数据存储。
  • 隔离性:服务之间通过定义良好的接口进行通信,具有很好的容错和隔离机制。

Spring Cloud与微服务

Spring Cloud简介

Spring Cloud是一个基于Spring Boot的微服务框架,它集成了多种微服务治理组件,实现了这些组件的自动化配置,提供了一站式的微服务解决方案。

服务拆分与远程调用

服务拆分后,不同服务之间的通信通常通过远程调用实现。以下是服务拆分的一些注意事项:

  1. 避免业务重复:确保不同微服务之间不会开发相同的业务逻辑。
  2. 数据独立性:每个微服务应有自己的数据库,避免跨服务的数据访问。
  3. 接口暴露:微服务应将业务功能封装成API,供其他服务调用。

微服务调用模式

微服务之间的调用通常基于HTTP请求,这种方式具有语言无关性,只要知道服务的IP、端口、接口路径和请求参数,就可以实现跨语言的服务调用。

1. RestTemplate方式

@Bean
public RestTemplate getRestTemplate(){
    return new RestTemplate();
}
@Autowired
private RestTemplate restTemplate;
@GetMapping("/createOrder/{gid}/{number}")
public Order order(@PathVariable("gid") Integer id,@PathVariable("number") Integer number){
    log.info("用户开始下单,调用商品系统,查询{}号商品信息",id);
    Goods goods = restTemplate.getForObject("http://localhost:9002/goods/getGoods/" + id, Goods.class);
    log.info("商品信息查询完毕:"+ JSON.toJSONString(goods));
    log.info("开始下单:");
    Order order = new Order();
    order.setUid(1);
    order.setUname("测试用户");
    order.setGid(goods.getId());
    order.setGname(goods.getGoodsName());
    order.setNumber(number);
    orderService.createOrder(order);
    log.info("下单成功");
    return order;
}

2. Fegin实现服务调用

Feign是Spring Cloud提供的一个声明式的伪Http客户端, 它使得调用远程服务就像调用本地服务一样简单, 只需要创建一个接口并添加一个注解即可。

在服务消费者上进行以下操作:

1.添加依赖

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

2.在启动类上添加注解

@EnableFeignClients

3.新建client包,并创建接口(把服务提供者controller对应的方法名复制过来,注意路径要完整

@FeignClient("goods-service")
public interface GoodsService {
 
    @RequestMapping("/goods/getGoods/{id}")
    public Goods goods(@PathVariable("id") Integer id);
}

4.调用代码示例

@Autowired
private GoodsService goodsService;
@GetMapping("/createOrder3/{gid}/{number}")
public Order order3(@PathVariable("gid") Integer id,@PathVariable("number") Integer number){
    log.info("用户开始下单,调用商品系统,查询{}号商品信息",id);
    //通过feign调用商品微服务
    Goods goods = goodsService.goods(id);
    log.info("商品信息查询完毕:"+ JSON.toJSONString(goods));
    log.info("开始下单:");
    Order order = new Order();
    order.setUid(1);
    order.setUname("测试用户");
    order.setGid(goods.getId());
    order.setGname(goods.getGoodsName());
    order.setNumber(number);
    orderService.createOrder(order);
    log.info("下单成功");
    return order;
 }

服务提供者与消费者

  • 服务提供者:在业务流程中,提供接口供其他服务调用的服务。
  • 服务消费者:在业务流程中,调用其他服务接口的服务。

一个服务可能同时扮演提供者和消费者的角色,这取决于业务流程的上下文。

总结与最佳实践

微服务架构提供了更细粒度的服务拆分,降低了服务间的耦合度,提高了系统的可维护性和可扩展性。然而,它也带来了架构复杂性,增加了运维、监控和部署的难度。

  1. 业务模块拆分:根据业务功能合理拆分微服务,确保每个服务都遵循单一职责原则。
  2. 接口暴露:微服务应将业务功能封装为API,便于其他服务调用。
  3. 独立数据库:每个微服务应有自己的数据库,保持数据的独立性。
  4. 服务治理:使用Spring Cloud等框架进行服务的注册、发现和配置管理,简化微服务治理。

本文原文来自CSDN

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号