如何把网站能搜到,县城做网站的多么,杭州cms建站模板下载,设计公司入川备案1.认识微服务
随着互联网行业的发展#xff0c;对服务的要求也越来越高#xff0c;服务架构也从单体架构逐渐演变为现在流行的微服务架构。这些架构之间有怎样的差别呢#xff1f;
1.1.单体架构
单体架构#xff1a;将业务的所有功能集中在一个项目中开发#xff0c;打…1.认识微服务
随着互联网行业的发展对服务的要求也越来越高服务架构也从单体架构逐渐演变为现在流行的微服务架构。这些架构之间有怎样的差别呢
1.1.单体架构
单体架构将业务的所有功能集中在一个项目中开发打成一个包部署。 单体架构的优缺点如下
优点
架构简单部署成本低
缺点
耦合度高维护困难、升级困难
1.2.分布式架构
分布式架构根据业务功能对系统做拆分每个业务功能模块作为独立项目开发称为一个服务。 分布式架构的优缺点
优点
降低服务耦合有利于服务升级和拓展
缺点
服务调用关系错综复杂
分布式架构虽然降低了服务耦合但是服务拆分时也有很多问题需要思考
服务拆分的粒度如何界定服务之间如何调用服务的调用关系如何管理
人们需要制定一套行之有效的标准来约束分布式架构。
1.3.微服务
微服务的架构特征
单一职责微服务拆分粒度更小每一个服务都对应唯一的业务能力做到单一职责自治团队独立、技术独立、数据独立独立部署和交付面向服务服务提供统一标准的接口与语言和技术无关隔离性强服务调用做好隔离、容错、降级避免出现级联问题 微服务的上述特性其实是在给分布式架构制定一个标准进一步降低服务之间的耦合度提供服务的独立性和灵活性。做到高内聚低耦合。
因此可以认为微服务是一种经过良好架构设计的分布式架构方案 。
但方案该怎么落地选用什么样的技术栈全球的互联网公司都在积极尝试自己的微服务落地方案。
其中在Java领域最引人注目的就是SpringCloud提供的方案了。
1.4.SpringCloud
SpringCloud是目前国内使用最广泛的微服务框架。官网地址https://spring.io/projects/spring-cloud。
SpringCloud集成了各种微服务功能组件并基于SpringBoot实现了这些组件的自动装配从而提供了良好的开箱即用体验。
其中常见的组件包括 另外SpringCloud底层是依赖于SpringBoot的并且有版本的兼容关系如下 我们课堂学习的版本是 Hoxton.SR10因此对应的SpringBoot版本是2.3.x版本。
1.5.总结 单体架构简单方便高度耦合扩展性差适合小型项目。例如学生管理系统 分布式架构松耦合扩展性好但架构复杂难度大。适合大型互联网项目例如京东、淘宝 微服务一种良好的分布式架构方案 ①优点拆分粒度更小、服务更独立、耦合度更低 ②缺点架构非常复杂运维、监控、部署难度提高 SpringCloud是微服务架构的一站式解决方案集成了各种优秀微服务功能组件
2.服务拆分和远程调用
任何分布式架构都离不开服务的拆分微服务也是一样。
2.1.服务拆分原则
这里我总结了微服务拆分时的几个原则
不同微服务不要重复开发相同业务微服务数据独立不要访问其它微服务的数据库微服务可以将自己的业务暴露为接口供其它微服务调用 2.2.服务拆分示例
以课前资料中的微服务cloud-demo为例其结构如下 cloud-demo父工程管理依赖
order-service订单微服务负责订单相关业务user-service用户微服务负责用户相关业务
要求
订单微服务和用户微服务都必须有各自的数据库相互独立订单服务和用户服务都对外暴露Restful的接口订单服务如果需要查询用户信息只能调用用户服务的Restful接口不能查询用户数据库
2.2.1.导入Sql语句
首先将课前资料提供的cloud-order.sql和cloud-user.sql导入到mysql中 cloud-user表中初始数据如下 cloud-order表中初始数据如下 cloud-order表中持有cloud-user表中的id字段。
2.2.2.导入demo工程
用IDEA导入课前资料提供的Demo 项目结构如下 导入后会在IDEA右下角出现弹窗 点击弹窗然后按下图选择 会出现这样的菜单 配置下项目使用的JDK 2.3.实现远程调用案例
在order-service服务中有一个根据id查询订单的接口 根据id查询订单返回值是Order对象如图 其中的user为null
在user-service中有一个根据id查询用户的接口 查询的结果如图 2.3.1.案例需求
修改order-service中的根据id查询订单业务要求在查询订单的同时根据订单中包含的userId查询出用户信息一起返回。 因此我们需要在order-service中 向user-service发起一个http的请求调用http://localhost:8081/user/{userId}这个接口。
大概的步骤是这样的
注册一个RestTemplate的实例到Spring容器修改order-service服务中的OrderService类中的queryOrderById方法根据Order对象中的userId查询User将查询的User填充到Order对象一起返回
2.3.2.注册RestTemplate
首先我们在order-service服务中的OrderApplication启动类中注册RestTemplate实例
package cn.itcast.order;import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;MapperScan(cn.itcast.order.mapper)
SpringBootApplication
public class OrderApplication {public static void main(String[] args) {SpringApplication.run(OrderApplication.class, args);}Beanpublic RestTemplate restTemplate() {return new RestTemplate();}
}2.3.3.实现远程调用
修改order-service服务中的cn.itcast.order.service包下的OrderService类中的queryOrderById方法 2.4.提供者与消费者
在服务调用关系中会有两个不同的角色
服务提供者一次业务中被其它微服务调用的服务。提供接口给其它微服务
服务消费者一次业务中调用其它微服务的服务。调用其它微服务提供的接口 但是服务提供者与服务消费者的角色并不是绝对的而是相对于业务而言。
如果服务A调用了服务B而服务B又调用了服务C服务B的角色是什么
对于A调用B的业务而言A是服务消费者B是服务提供者对于B调用C的业务而言B是服务消费者C是服务提供者
因此服务B既可以是服务提供者也可以是服务消费者。 学习笔记主要来自黑马程序员教程