学习目标
- 了解系统架构的演变
- 知道什么是SpringCloud
- 独立搭建Eureka注册中心
- 独立配置Robbin负载均衡
系统架构演变
要学微服务,我们先来看看系统架构的演变史,从而对微服务架构进行更深层次的了解。
随着互联网的发展,网站应用的规模不断扩大,需求的剧增,带来了系统架构不断的演进、升级和迭代。
系统架构的演变,大体上划分为:传统架构、负载均衡架构,分布式服务架构,SOA架构,微服务架构。
传统架构:单一应用
当网站流量很小时,只需一个应用,将所有功能都部署在一起。
集群:负载均衡
随着访问量的变大,一个Tomcat服务器已经不能满足需求。
需要配置多个Tomcat,做Tomcat集群。通过负载均衡服务器访问不同的Tomcat服务器,每个Tomcat中部署完整项目即可。
分布式服务
每一个Tomcat存放完整项目,会存在部分业务模块长时间用不到,部分业务模块不够用的现象。
我们将按照功能模块拆分项目,每一台服务器仅存放某一个模块,通过多系统的配合完成整体业务逻辑,此种方式成为:分布式服务。
SOA架构:面向服务架构
SOA(Service Oriented Architecture)面向服务架构,就是将工程拆分成表现层和服务层两个工程。
服务层中包含业务逻辑,只需要对外提供服务即可。
表现层只需要处理和页面的交互,业务逻辑都是调用服务层的服务来实现。
微服务
微服务是SOA的一种实现,也可以说是微服务是去ESB(取中心)的SOA。
微服务架构是一种将单个应用程序作为一套小型服务开发的方法。每种应用程序都可以独立运行。应用程序之间远程调用进行通信。
微服务总结:(特性)
- 完全独立的一个最小个体。(可以独立运行)
- 个体与个体之间,通过远程调用进行访问。例如:基于RESTFul风格的。
- 通过注册中心,将不同个体可以进行整合。
- 通过网关,可以进行统一的入口访问。
初始SpringCloud
什么是微服务
微服务是一种架构风格,即将单体应用划分为小型的服务单元。
微服务的实现方式很多,但是最火的莫过于Spring Cloud了。为什么?
- 后台硬:作为Spring家族的一员,有整个Spring全家桶靠山,背景十分强大。
- 技术强:Spring作为Java领域的前辈,可以说是功力深厚。有强力的技术团队支撑,一般人还真比不了
- 群众基础好:可以说大多数程序员的成长都伴随着Spring框架,试问:现在有几家公司开发不用Spring?SpringCloud与Spring的各个框架无缝整合,对大家来说一切都是熟悉的配方,熟悉的味道。
- 使用方便:相信大家都体会到了SpringBoot给我们开发带来的便利,而SpringCloud完全支持SpringBoot的开发,用很少的配置就能完成微服务框架的搭建
什么是SpringCloud
Spring Cloud 是一系列框架的集合,它利用Spring Boot的开发便利性,简化了分布式系统开发,如:服务注册、服务发现、配置中心。消息总线、负载均衡、熔断器、数据监控等。
Spring Cloud 主要贡献者是Netflix,也就是Spring Cloud是对Netflix贡献的框架的二次封装或优化。
通俗的讲,SpringCloud就是用于构建微服务开发和治理的框架集合。
SpringCloud常见模块
SpringCloud主要涉及的组件包括:
- Eureka:服务注册中心,用于管理服务
- Ribbon:负载均衡(集群)
- Hystrix:熔断器,能够防止服务的雪崩效应。
- Zuul:服务网关,提供路由转发、请求过滤等功能。
- Feign:服务调用,简化Http接口的调用。
- 以上只是其中一部分,架构图:
版本
SpringCloud的版本命名比较特殊,因为它不是一个组件,而是许多组件的集合,它的命名是以A到Z的为首字母的一些单词组成:
我们的学习,将以Hoxton.SR9的版本。(最新版本,需要同步升级相关软件)
参考文档:Spring Cloud
入门案例
父项目
创建项目
创建父项目:cloud-parent-1007
pom配置文件
修改pom.xml,确定spring cloud的版本
<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.czxy.cloud</groupId> <artifactId>cloud-parent-1007</artifactId> <version>1.0-SNAPSHOT</version> <!-- 1 确定spring boot的版本--> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.3.5.RELEASE</version> </parent> <!--2 确定版本--> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <java.version>1.8</java.version> <spring-cloud-release.version>Hoxton.SR9</spring-cloud-release.version> </properties> <!-- 3 锁定sprig cloud版本--> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>${spring-cloud-release.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <!-- 4 确定spring cloud私有仓库 <repositories> <repository> <id>spring-milestones</id> <name>Spring Milestones</name> <url>https://repo.spring.io/milestone</url> <snapshots> <enabled>false</enabled> </snapshots> </repository> </repositories> --> </project>
原理分析
基本架构:
- Eureka:就是服务注册中心,用于管理所有注册服务。
- 班级服务,服务的提供者,启动后向Eureka注册自己地址,方便服务调用方获取。
- 学生服务,服务的调用者,定期从eureka注册中心中获得服务列表。
- 心跳(续约):提供者定期通过http方式向Eureka刷新自己的状态。
Eureka注册中心(服务端)
认识Eureka
当开发大型项目时,服务的提供方和服务的调用方,将会非常庞大,管理服务的成本将几何倍的增长。
Eureka将负责服务的注册、发现、状态监控。
注册:Eureka负责管理、记录服务提供者的信息
发现:服务调用者无需自己寻找服务,而是把自己的需求告诉Eureka,然后Eureka会把符合你需求的服务告诉你
监控:服务提供方与Eureka之间通过“心跳”机制进行监控,当某个服务提供方出现问题,Eureka自然会把它从服务列表中剔除
编写注册服务中心(10086)
步骤一:创建注册中心项目(服务),cloud-eureka-1007
步骤二:修改pom.xml文件,添加依赖(web项目、eureka服务)
<dependencies> <!--web起步依赖--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- Eureka服务端 --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> </dependency> </dependencies>
步骤三:创建application.yml,配置注册中心
- register-with-eureka: false # 是否注册自己的信息到注册中心,默认是true
- fetch-registry: false # 是否拉取其它服务的信息,默认是true
- service-url: # 注册中心的地址,现在是自己的地址。如果是集群,需要加上其它Server的地址。
# 端口号 server: port: 10086 # 服务名称 spring: application: name: cloud-eureka-1007 # eureka的配置 eureka: client: service-url: defaultZone: http://localhost:${server.port}/eureka/ # 注册中心的地址 register-with-eureka: false # 是否注册自己的信息到注册中心,默认是true fetch-registry: false # 是否拉取其它服务的信息,默认是true
步骤四:编写启动类,添加注解 @EnableEurekaServer
1.package com.czxy; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer; /** * Created by liangtong. */ @SpringBootApplication @EnableEurekaServer public class EurekaApplication { public static void main(String[] args) { SpringApplication.run(EurekaApplication.class, args ); } }
步骤五:访问
http://localhost:10086