网站架构演变
集群:不同的机器,执行同一个计算问题。
- 一台机器累如狗,怎么办?来两台,负载均衡。
- 一台机器宕机,怎么办?来两台,灾备容错。
- 一台机器性能好,怎么办?让性能好的,加权轮询。
分布式:把一个复杂的计算问题,拆分多个子计算,分布到不同机器上,使其并行执行。
- 一个计算问题计算过长,怎么办?拆分成子计算,在不同机器并行执行,缩短计算时长。
- 一个计算问题涉及另一个机器的资源,怎么办?拷贝过来?那我100台都需要呢?所以,需要远程调用和协作。
为什么使用微服务?
下面借用Dubbo的网站架构发展说起。
单一应用架构:将所有功能都部署在一起,以减少部署节点和成本。
垂直应用架构:当访问量大了,单一应用增加机器带来的加速越来越小,把应用拆分互不相干的的几个应用,以提高效率。
分布式框架:当垂直应用过多,应用之间交互不可避免,将核心业务抽取,作为独立服务,逐渐形成稳定的服务中心,使前端能更快的响应市场的变化。
流动计算框架:当服务越来越多,此时需要增加一个调度中心基于访问的压力实时管理集群,提高集群的利用率。
微服务和面向服务(SOA)区别
借用蚂蚁课堂余老师课程的一张图说话,微服务与面向服务架构本质上都是分布式面向服务架构,区别在于,面向服务架构(SOA)主要针对银行xml格式 企业级 ESB服务 重量级,如webservice远程调用(HTTP+XML),而微服务更加微小,轻量采用HTTP+Json+RESTful风格 轻量级 独立运行。
SpringCloud概述
谈到SpringCloud之前,先看看微服务带来的问题,接口地址如何管理、容错机制、负载均衡、网关、路由策略、高并发情况下,怎么接口限流、断路(服务宕机如何处理)。
微服务解决框架-SpringCloud、Dubbo
SpringBoot和SpringCloud的关系
- SpringBoot简化xml配置,快速整合框架
- SpringCloud是一整套微服务解决方案--RPC远程调用
关系SpringBoot的SpringMVC暴露接口,而SpringCloud管理接口,存在依赖关系。
SpringCloud解决问题
配置管理(注册中心Eureka,Dubbo的是Zookeeper)、服务发现、服务注册、断路器(非常重要,容错机制、限流、调用接口失败如何解决)、路由策略(接口分发那台机器上去)、负载均衡、全局锁、分布式会话、客户端调用、接口网关、服务管理系统。
服务注册和发现(Eureka)
什么是Eureka
官方的介绍在这里Eureka wiki。Eureka是Netflix开源的一个RESTful服务,主要用于服务的注册发现。Eureka由两个组件组成:Eureka服务器和Eureka客户端。Eureka服务器用作服务注册服务器。Eureka客户端是一个java客户端,用来简化与服务器的交互、作为轮询负载均衡器,并提供服务的故障切换支持。Netflix在其生产环境中使用的是另外的客户端,它提供基于流量、资源利用率以及出错状态的加权负载均衡。
Eureka的吸引力来源于以下几点:
- 开源:大家可以对实现一探究竟,甚至修改源码。
- 可靠:经过Netflix多年的生产环境考验,使用应该比较靠谱省心
- 功能齐全:不但提供了完整的注册发现服务,还有Ribbon等可以配合使用的服务。
- 基于Java:对于Java程序员来说,使用起来,心里比较有底。
- spring cloud可以使用Spring Cloud, 与Eureka进行了很好的集成,使用起来非常方便。
搭建注册中心、服务提供者、服务消费者
实现服务注册
1.创建Eurekaserver项目
2.Maven依赖
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.2.RELEASE</version>
<relativePath /> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<!--eureka server -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka-server</artifactId>
</dependency>
<!-- spring boot test -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Dalston.RC1</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
<repositories>
<repository>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<url>https://repo.spring.io/milestone</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
3.配置application.yml
server:
port: 8888
eureka:
instance:
hostname: localhost
client:
registerWithEureka: false
fetchRegistry: false
serviceUrl:
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
4.启动EurekaServer
@SpringBootApplication
@EnableEurekaServer
public class App {
public static void main(String[] args) {
SpringApplication.run(App.class, args);
}
}
5.打开EurekaServer界面
服务提供者
创建一个服务提供者 会员服务工程,提供会员查询服务信息。
1.创建项目service-member
2.Maven依赖