拉勾教育PC站-微服务版
— 老孙
1、回顾微服务
1. 概述
我们先看微服务的提出者马丁福勒的论文中,是如何描述微服务的
微服务是一种架构模式或者架构风格,它提倡将单一的应用程序划分成一组小的服务,每个服务运行在其独立的进程中-,服务之间相互协调,配置,共同为用户提供最终的价值;
通俗点:
封建王朝,很有多州郡,每个州郡都是皇上的亲戚,也有贡献突出的将军,镇南侯,平西王等等封疆大吏,他们每个人在自己的管辖区域,就是最高权力的象征。
自己的州郡都独立运营(单一架构)
但是风土人情不同,统治的策略也要满足不同的需求。(南方有文化底蕴,孔夫子教化即可。西北民风彪悍,肯定要用雷霆手段)
这样大大小小的不同州郡,统一起来,就是一个至高权力的朝廷(总架构)
总结:
将传统的一站式应用,拆分成一个一个独立的服务,彻底的解除耦合,每个服务提供单个业务功能的服务,一个服务就做一件事,成立一个独立的进程,能够自行启动和销毁,甚至拥有独立的数据库。
2. 优点
-
每个服务内聚,足够小,开发简单,效率高,一个服务做一件事;
-
微服务是松耦合的,无论是开发还是部署阶段都是独立;
-
微服务能使用不同的语言开发;
4) 微服务只是业务逻辑代码,不会和HTML,CSS或其他页面组件混合;
- 每个服务都有自己的储存能力,可以有自己的数据库,当然,也可以有统一的数据;
3. 缺点
-
开发人员要处理分布式系统的复杂性;
-
随着服务的增加,运维的难度越大;
-
系统部署依赖
-
通信成本加大
-
数据一致性难搞
-
系统集成测试麻烦
-
性能监控不易
-
。。。。
4. 微服务与微服务架构
4.1 微服务
-
强调的是一个服务的大小, 关注的是一个点 ,能够解决某个问题而存在的应用,类似于项目中的某个工程/module;
-
单独的牙科医院,眼科医院;
-
手机,电脑,沙发,床垫,运动服,每一个都是微服务;
-
专注个体,每个个体完成一个具体的任务或功能;
4.2 微服务架构
-
一种架构模式,它提倡单一应用程序划分一组小的服务,服务之间相互协调,相互配合,为用户提供最终的价值;
-
服务之间采用轻量级通信机制,(HTTP协议的RESTfull)
-
每个服务都围绕具体的业务进行构建,并且能够独立部署到生产环境中;
-
尽量避免统一的,集中式的服务管理机制
-
单独的门诊就不要了,我们所有的门诊整合,形成了一个综合性医院
-
小米生态链,牙刷,电饭锅,手机,路由器,全是小米的。
4.3 SpringCloud和SpringBoot区别?
- SpringBoot专注于快速方便的开发单个个体服务;
- SpringCloud关注全局微服务的协调和整理,它将SpringBoot开发的一个个单体微服务整合起来;
- SpringBoot可以独立使用开发,但是SpringCloud离不开SpringBoot,属于依赖关系;
- SpringBoot属于一个科室,SpringCloud是综合医院;
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-ad-boot:广告微服务:8001
-
edu-user-boot:用户微服务:8002
-
edu-authority-boot:认证微服务:80
-
edu-course-boot:课程微服务:8004
-
edu-comment-boot:留言微服务:8005
-
edu-pay-boot:支付微服务:8006
-
edu-order-boot:订单微服务:8007
-
edu-config-boot:配置中心:8008
-
edu-gateway-boot:网关微服务:9001
3、搭建项目
3.1 父工程
- 父工程为聚合项目,打包方式为pom
- src目录也没有意义,可以删除
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<packaging>pom</packaging>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.4.2</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.lagou</groupId>
<artifactId>edu-lagou</artifactId>
<version>0.0.1-SNAPSHOT</version>
<properties>
<java.version>1.8</java.version>
<spring-cloud.version>2020.0.0</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
</project>
3.2 创建服务中心
- 在父工程中创建一个新的Module
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.lagou</groupId>
<artifactId>edu-lagou</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<groupId>com.lagou</groupId>
<artifactId>edu-eureka-boot</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>edu-eureka-boot</name>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
- 开启服务管理器,调试会方便一些
@SpringBootApplication
@EnableEurekaServer //开启Eureka服务
public class EduEurekaBootApplication {
public static void main(String[] args) {
SpringApplication.run(EduEurekaBootApplication.class, args);
}
}
- 修改配置文件后缀为 yml
server:
# 配置服务端口
port: 7001
eureka:
instance:
hostname: localhost
client:
service-url:
# 配置eureka服务器地址
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
#是否需要将自己注册到注册中心(注册中心集群需要设置为true)
register-with-eureka: false
#是否需要搜索服务信息 因为自己是注册中心所以为false
fetch-registry: false
- 启动项目