微服务架构


前言

文章内容输出来源:拉勾教育JAVA就业训练营


1、微服务

1.1 概述

我们先看微服务的提出者马丁福勒的论文中,是如何描述微服务的
在这里插入图片描述
微服务是一种架构模式或者架构风格,它提倡将单一的应用程序划分成一组小的服务,每个服务运行在其独立的进程中-,服务之间相互协调,配置,共同为用户提供最终的价值;
通俗点:

  • 封建王朝,很有多州郡,每个州郡都是皇上的亲戚,也有贡献突出的将军,镇南侯,平西王等等封疆大吏,他们每个人在自己的管辖区域,就是最高权力的象征。
  • 自己的州郡都独立运营(单一架构)
  • 但是风土人情不同,统治的策略也要满足不同的需求。(南方有文化底蕴,孔夫子教化即可。西北民风彪悍,肯定要用雷霆手段)
  • 这样大大小小的不同州郡,统一起来,就是一个至高权力的朝廷(总架构)

总结:
将传统的一站式应用,拆分成一个一个独立的服务,彻底的解除耦合,每个服务提供单个业务功能的服务,一个服务就做一件事,成立一个独立的进程,能够自行启动和销毁,甚至拥有独立的数据库

1.2 优点

  1. 每个服务内聚,足够小,开发简单,效率高,一个服务做一件事;
  2. 微服务是松耦合的,无论是开发还是部署阶段都是独立;
  3. 微服务能使用不同的语言开发;
  4. 微服务只是业务逻辑代码,不会和HTML,CSS或其他页面组件混合;
  5. 每个服务都有自己的储存能力,可以有自己的数据库,当然,也可以有统一的数据;

1.3 缺点

  1. 开发人员要处理分布式系统的复杂性;
  2. 随着服务的增加,运维的难度越大;
  3. 系统部署依赖
  4. 通信成本加大
  5. 数据一致性难搞
  6. 系统集成测试麻烦
  7. 性能监控不易
  8. 。。。。

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

-DubboSpringCloud
服务注册中心ZookeeperString Cloud Netflix Eureka
服务调用方式RPCREST API
服务监控Dubbo-monitorSpring 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个容器”
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值