详解SpringCloud微服务技术栈:认识微服务、服务拆分与远程调用

👨‍🎓作者简介:一位大四、研0学生,正在努力准备大四暑假的实习

🌌上期文章:首期文章

📚订阅专栏:微服务技术全家桶

希望文章对你们有所帮助

在此之前,耗时半个月,我已经将Redis进行了一个原理上的速成以及项目的制作,整个项目我觉得还是很不错的,基本已经涵盖了单结点Redis能做的所有事。而且在学习的过程中,我也将mybatis-plus、docker、nginx的反向代理、负载均衡都速成了一遍,收获还是很大的。

当然Redis的哨兵机制、分片集群这些我都还没去怎么学习,为了快点将自己的技术栈叠高一点,我直接进军微服务架构。

微服务技术栈的学习内容主要涵盖了SpringCloud、RabbitMQ、Docker、Redis、ElasticSearch、分布式等,要花上一段时间去学习,并且做一个中小型的项目。

微服务技术栈导学

服务架构演变

微服务架构学习之前,经常做的项目是一个单体架构的。

单体架构

单体架构:将业务的所有功能集中在一个项目中开发,打成一个包部署。

优点:架构简单、部署成本低

缺点:耦合度高

单体架构肯定是不适合进行大型项目的开发的。

分布式架构

分布式架构:根据业务功能对系统进行拆分,每个业务模块作为独立项目开发,称为一个服务。

优点:降低服务的耦合度,有利于服务的升级拓展

缺点:不同的功能都做成了服务集群,方法之间不再那么方便互相调用了,因此我们需要进行服务的治理

分布式架构要考虑以下的问题:

1、服务的拆分粒度;

2、服务集群地址的维护

3、服务之间的远程调用

4、感知服务的健康状态

微服务

到目前为止,微服务是解决分布式架构考虑问题的最佳解决方案,它是一种经过良好架构设计的分布式架构方案,微服务架构的特征:

1、单一职责:拆分粒度更小,每一个服务都对应唯一的业务能力,做到单一职责

2、面向服务:微服务对外暴露业务接口

3、自治:团队独立、技术独立、数据独立、部署独立

4、隔离性强:服务调用做好隔离、容错、降级,避免出现级联问题

总之,微服务架构非常符合我们之前学习软件工程、设计模式这些理论课过程中反复提到的高内聚、低耦合

微服务技术对比

可以看到,Feign是基于http请求的,只要我们是restful风格,调用和之前就差不多,学习成本会相对低很多。

学习微服务架构,比较推荐的方式就是SpringCloud+Feign或者SpringCloudAlibaba+Feign。

SpringCloud

官网地址:SpringCloud官网地址

SpringCloud集成了各种微服务功能组件,并基于SpringBoot实现了这些组件的自动装配,从而提供了良好的开箱即用体验,这也是它这么火热的原因。

需要注意好版本号问题:

服务拆分及远程调用

服务拆分

注意事项:

1、单一职责:不同微服务,不要重复开发相同业务

2、数据独立:不要访问其它微服务的数据库

3、面向服务:将自己的业务暴露为接口,供其它微服务调用

Demo工程

想要模拟一下服务的拆分,可以先自己试一下demo,查看不访问其他服务的数据库,能否实现业务之间的调用。

demo的工程代码,以及两个数据库表tb_user、tb_order都可以看我的资源去自行下载并验证,也可以直接在下面的百度网盘中下载:demo

这个demo的来源出自于黑马程序员。

导入工程,并且创建2个数据库,分别是cloud_order与cloud_order,各包含一张表(tb_order与tb_user),2张表不要创建在同一个数据库下面,要做到数据独立性,体现分布式。

自行修改配置文件,运行代码调通,都是很简单的query操作,不做解析了。

远程调用

当我们的用户想要看到订单详情表的时候,这个详情表除了要有订单的信息,还需要有购买的用户的信息,在单体架构我们很好实现这一点,只要我们能访问到用户的相关信息,那么用注解开发是很容易增加字段去注入用户信息的。

然而现在数据库是分离的,也就是说order-service无法直接访问user-service的数据库,因此,只能让订单业务去向用户业务发出请求:

远程调用方式分析:

1、回顾一下http请求原理,简单来说无非就是浏览器发出http请求信息,而服务中利用@GetMapping去接受请求,查询数据库后返还相应的信息给前端

2、因此可以设想让订单模块发起http请求给用户模块,用户模块查询自己的数据库后将相应数据返还给订单模块,做出拼接后即可得到订单详情表。

因此,应该思考如何使得java代码发出http请求。

Spring提供了一个工具叫做RestTemplate ,专门用于在java代码中发起http请求。

1、在order-service的启动类OrderApplication中用@Bean注解注册RestTemplate:

java 复制代码
	@Bean
    public RestTemplate restTemplate(){
        return new RestTemplate();
    }

2、对订单的业务做修改:

java 复制代码
@Service
public class OrderService {

    @Resource
    private OrderMapper orderMapper;

    @Resource
    private RestTemplate restTemplate;

    public Order queryOrderById(Long orderId) {
        // 1.查询订单
        Order order = orderMapper.findById(orderId);
        // 2.查询用户,利用RestTemplate发起http请求
        String url = "http://localhost:8081/user/" + order.getUserId();
        User user = restTemplate.getForObject(url, User.class);//getForObject默认是返回json格式,如果指定返还的内容,则会自动反序列化
        //将用户注入到order中
        order.setUser(user);
        // 4.返回
        return order;
    }
}

现在已经成功查询到详情页了:

这篇文章就当洒洒水了,今天太累了,就摆烂了,明天调整回来。

相关推荐
whisperrr.11 分钟前
【spring01】Spring 管理 Bean-IOC,基于 XML 配置 bean
xml·java·spring
天上掉下来个程小白19 分钟前
HttpClient-03.入门案例-发送POST方式请求
java·spring·httpclient·苍穹外卖
robin_suli1 小时前
Spring事务的传播机制
android·java·spring
喵个咪2 小时前
开箱即用的GO后台管理系统 Kratos Admin - 定时任务
后端·微服务·消息队列
暮乘白帝过重山2 小时前
Singleton和Prototype的作用域与饿汉式/懒汉式的初始化方式
spring·原型模式·prototype·饿汉式·singleton·懒汉式
ejinxian3 小时前
Spring AI Alibaba 快速开发生成式 Java AI 应用
java·人工智能·spring
杉之3 小时前
SpringBlade 数据库字段的自动填充
java·笔记·学习·spring·tomcat
圈圈编码3 小时前
Spring Task 定时任务
java·前端·spring
爱的叹息4 小时前
Java 连接 Redis 的驱动(Jedis、Lettuce、Redisson、Spring Data Redis)分类及对比
java·redis·spring
松韬4 小时前
Spring + Redisson:从 0 到 1 搭建高可用分布式缓存系统
java·redis·分布式·spring·缓存