目录
前言
文章内容输出来源:拉勾教育JAVA就业训练营
1、微服务
1.1 概述
我们先看微服务的提出者马丁福勒的论文中,是如何描述微服务的
微服务是一种架构模式或者架构风格,它提倡将单一的应用程序划分成一组小的服务,每个服务运行在其独立的进程中-,服务之间相互协调,配置,共同为用户提供最终的价值;
通俗点:
- 封建王朝,很有多州郡,每个州郡都是皇上的亲戚,也有贡献突出的将军,镇南侯,平西王等等封疆大吏,他们每个人在自己的管辖区域,就是最高权力的象征。
- 自己的州郡都独立运营(单一架构)
- 但是风土人情不同,统治的策略也要满足不同的需求。(南方有文化底蕴,孔夫子教化即可。西北民风彪悍,肯定要用雷霆手段)
- 这样大大小小的不同州郡,统一起来,就是一个至高权力的朝廷(总架构)
总结:
将传统的一站式应用,拆分成一个一个独立的服务,彻底的解除耦合,每个服务提供单个业务功能的服务,一个服务就做一件事,成立一个独立的进程,能够自行启动和销毁,甚至拥有独立的数据库
1.2 优点
- 每个服务内聚,足够小,开发简单,效率高,一个服务做一件事;
- 微服务是松耦合的,无论是开发还是部署阶段都是独立;
- 微服务能使用不同的语言开发;
- 微服务只是业务逻辑代码,不会和HTML,CSS或其他页面组件混合;
- 每个服务都有自己的储存能力,可以有自己的数据库,当然,也可以有统一的数据;
1.3 缺点
- 开发人员要处理分布式系统的复杂性;
- 随着服务的增加,运维的难度越大;
- 系统部署依赖
- 通信成本加大
- 数据一致性难搞
- 系统集成测试麻烦
- 性能监控不易
- 。。。。
1.4 微服务与微服务架构
1.4.1 微服务
强调的是一个服务的大小,关注的是一个点 ,能够解决某个问题而存在的应用,类似于项目中的某个工程/module;
单独的牙科医院,眼科医院;
手机,电脑,沙发,床垫,运动服,每一个都是微服务;
专注个体,每个个体完成一个具体的任务或功能;
1.4.2 微服务架构
- 一种架构模式,它提倡单一应用程序划分一组小的服务,服务之间相互协调,相互配合,为用户提 供最终的价值;
- 服务之间采用轻量级通信机制,(HTTP协议的RESTfull)
- 每个服务都围绕具体的业务进行构建,并且能够独立部署到生产环境中;
- 尽量避免统一的,集中式的服务管理机制单独的门诊就不要了,我们所有的门诊整合,形成了一个综合性医院
- 小米生态链,牙刷,电饭锅,手机,路由器,全是小米的。
1.4.3 SpringCloud和SpringBoot区别?
- SpringBoot专注于快速方便的开发单个个体服务;
- SpringCloud关注全局微服务的协调和整理,它将SpringBoot开发的一个个单体微服务整合起来;
- SpringBoot可以独立使用开发,但是SpringCloud离不开SpringBoot,属于依赖关系;
- SpringBoot属于一个科室,SpringCloud是综合医院;
1.4.4 SpringCloud对比Dubbo
- | Dubbo | SpringCloud |
---|---|---|
服务注册中心 | Zookeeper | String Cloud Netflix Eureka |
服务调用方式 | RPC | REST API |
服务监控 | Dubbo-monitor | Spring Boot Admin |
断路器 | 不完善 | Spring Cloud Netflix Hystrix |
服务网关 | 无 | Spring Cloud Netflix Zuul |
分布式配置 | 无 | Spring Cloud Config |
服务跟踪 | 无 | Spring Cloud Sleuth |
消息总线 | 无 | Spring Cloud Bus |
数据流 | 无 | Spring Cloud Stream |
批量任务 | 无 | Spring Cloud Task |
2、微服务架构项目
edu-lagou:父工程
edu-api:通用的公共子模块
edu-eureka-boot:服务中心:7001
edu-user-boot:用户微服务:80
edu-course-boot:课程微服务:8002
edu-order-boot:订单微服务:8003
edu-pay-boot:支付微服务:8004
edu-comment-boot:留言微服务:8005
3、搭建项目
3.1 父工程
3.2 创建服务中心
edu-eureka-boot
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
yml配置
3.3 创建微服务
3.4 分库、
3.5 订单分表
<dependency>
<groupId>org.apache.shardingsphere</groupId>
<artifactId>sharding-jdbc-spring-boot-starter</artifactId>
<version>4.0.0-RC1</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.10</version>
</dependency>
3.7 网关
<!--GateWay 网关-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<!--引入webflux-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webflux</artifactId>
</dependency>
3.8 高并发redis
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
4、IDEA集成Docker部署微服务
4.1 开启远程访问
# 修改配置文件
[root@A ~]# vim /lib/systemd/system/docker.service
修改
ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix://var/run/docker.sock
# 重新加载配置文件
[root@A ~]# systemctl daemon-reload
# 重启docker
[root@A ~]# service docker restart
# 查看端口是否开启
[root@A ~]# netstat -nlpt
# 验证端口是否生效
[root@A ~]# curl http://192.168.204.141:2375/info
4.2 Docker的Maven插件
- 传统的过程中,要经历打包,部署,上传到linux,编写Dockerfile,构建镜像,创建容器等步骤
- docker-maven-plugin就是帮助我们在开发构成中,自动生成镜像并推送到仓库中
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>1.0.0</version>
<configuration>
<!--镜像名称 laosun/test-docker-demo-->
<imageName>linle/${project.artifactId}</imageName>
<!--标签版本-->
<imageTags>
<imageTag>latest</imageTag>
</imageTags>
<!--基础镜像,相当于Dockerfile里的from-->
<baseImage>java</baseImage>
<!--标签版本-->
<maintainer>linle linle1630@163.com</maintainer>
<!--入口点,project.build.finalName就是project标签下的build标签下的filename标签内容,test-docker-demo-->
<!--相当于启动容器后,会自动执行java -jar/test-docker-demo.jar-->
<entryPoint>["java", "-jar", "/${project.build.finalName}.jar"]</entryPoint>
<!--docker地址-->
<dockerHost>http://192.168.102.20:2375</dockerHost>
<!-- 这里是复制 jar 包到 docker 容器指定目录配置 -->
<resources>
<resource>
<targetPath>/</targetPath>
<!--复制的根目录,target-->
<directory>${project.build.directory}</directory>
<!--把哪个文件上传到docker,相当于Dockerfile里的add test-docker-demo.jar /-->
<include>${project.build.finalName}.jar</include>
</resource>
</resources>
</configuration>
</plugin>
4.3 执行命令
mvn clean package docker:build
- 对项目进行打包,并构建镜像到docker上
- 第一次执行多等一会,要拉取java的环境等等操作
- 命令执行完成,会自动将jar包镜像推送到docker
- 在idea的docker界面,根据镜像创建容器即可。
- “一个镜像可以创建N个容器”