微服务的简介
一:架构的演变
单体服务
当网站流量很小时,只需要一个应用,将所有功能都部署在一起,以减少部署节点和成本,此时,
用于简化增删改查工作量的数据访问框架(ORM)是关键。
垂直应用服务
当访问量逐渐增大时,单一应用增加机器带来的加速度越来越小,将应用拆分成互不相干的几个应用,
以提升效率,此时,用于加速前端页面开发的Web框架(MVC)是关键
分布式服务
当垂直应用越来越多,应用之间交互不可避免,将核心业务抽取出来,作为独立的服务,逐渐行成稳定的服务中心,
使前端应用能更快速的响应多变的市场需求,此时,用于提高业务复用及整合的分布式框架(RPC)是关键。
没有注册中心的概念,而只是重视RPC,认为我们只有通过静态的ip地址能找到服务提供者就行了,
不考虑服务的发现,服务的注册,以及服务的负载均衡。
流动计算
当服务越来越多,容量的评估,小服务资源的浪费等问题逐渐显现,此时需增加一个调度中心基于访问压力实时管理集群容量,
提高集群利用率,此时,用于提高机器利用率的资源调度和治理中心(SOA)是关键。
强调服务的管理,引入注册中心。
微服务(新的概念)
微服务,是著名的OO(面向对象,Object Oriented)专家Martin Fowler提出来的,它是用来描述将软件应用程序设计为独立部署的
服务的一种特殊方式。最近两年,微服务在各大技术会议、文章、书籍上出现的频率已经让人意识到它对于软件领域所带来的影响力。
微服务架构的系统是一个分布式系统,按业务领域划分为独立的服务单元,有自动化运维、容错、快速演进的特点,
它能够解决传统单体架构系统的痛点,同时也能满足越来越复杂的业务需求
微服务的特点
1:可以使用不同的语言。
2:每个微服务可以有自己的数据库
3:微服务强调单一服务的完整性,不建议使用服务间频繁的远程的调用。
4:微服务直接调用Http协议+json/xml文件来完成
微服务专门让我们注重架构的开发!
Spring Cloud Eurekka 简介
注册中心
“Eureka"来源于古希腊词汇,意为“发现了”,在软件领域,Eureka是Netflix在线影片公司开源的一个服务注册与发现的组件,
和其他Netflix公司的服务组件(例如负载均衡、熔断器、网关等)一起,被Spring Cloud 社区整合为Spring Cloud Netflix模块。
Eureka 是Netfix 贡献给Spring Cloud的一个框架!Netfix给Spring Cloud贡献了很多框架,后面我们会学习到!
SpringCloud Eureka 与zookeeper的区别
分布式特征
C:数据的一致性(A,B,C里面的数据是一致的)
A:服务的可用性(若zk集群里面的master挂了怎么办)
在zk里面,若主机挂了,则zk集群整体不对外提供服务,需要选一个新的出来,才能继续对外提供服务。
Eureka注重服务的可用性,当Eureka集群只有一台活着,他就能对外提供服务,P:分区容错性
(在集群里面的集群,因为网络的原因,机房的原因,可能导致数据不会里面同步),它在分布式必须需要实现的特性
zookeeper注重数据的一致性,cp
Eureka注重服务的可用性AP
2.2SpringCloud 其他注册中心的选择
Eureka修改了授权协议,之前的Eureka,Apache2.0的协议,后续的Eureka,可能使用其它的授权协议。
SpringCloud还有别的注册中心Consule,阿里巴巴提供Nacos都能作为注册中心,我们的选择还是很多的。
SpringCloud Eureka快速入门案例
新建Eureka-Server使用idea工具,maven管理工具进行搭建
废话不多说直接上代码
首先需要配置一下自己电脑的hosts文件 目录如:C:\Windows\System32\drivers\etc
在hosts配置文件加入如下代码
127.0.0.1 eureka6001.com
127.0.0.1 eureka6004.com
项目的总目录结构如图:
第一步:添加依赖父工程pom.xml文件
<?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.aliwo.eureka</groupId>
<artifactId>eureka-project</artifactId>
<version>1.0-SNAPSHOT</version>
<modules>
<module>eureka-server</module>
<module>eureka-client6002</module>
<module>eureka-client6003</module>
<module>eureka-server6004</module>
</modules>
<packaging>pom</packaging>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<junit.version>4.12</junit.version>
<log4j.version>1.2.17</log4j.version>
<mybatis.spring.boot.version>1.3.0</mybatis.spring.boot.version>
</properties>
<dependencyManagement>
<dependencies>
<!--spring boot 2.2.2-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.2.2.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!--spring cloud Hoxton.SR1-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Hoxton.SR1</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!--spring cloud alibaba 2.1.0.RELEASE-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.1.0.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>${mybatis.spring.boot.version}</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<fork>true</fork>
<addResources>true</addResources>
</configuration>
</plugin>
</plugins>
</build>
</project>
eureka-server的项目结构如图:
eureka-server注册中心的pom.xml文件
<?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">
<parent>
<artifactId>eureka-project</artifactId>
<groupId>com.aliwo.eureka</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>eureka-server</artifactId>
<dependencies>
<!--eureka server-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
<!--boot web actuator-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!--一般通用配置 热部署工具-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
</dependency>
</dependencies>
</project>
application.yml文件代码
server:
port: 6001
spring:
application:
name: eureka-server
eureka:
client:
#是否将自己注进注册中心,默认为true
register-with-eureka: false
#是否从注册中心获取已有的注册信息,默认为true,单节点没有事,集群必须设置为true
fetch-registry: false
serviceUrl:
#配置eureka-server集群,相互配置
defaultZone: http://eureka6004.com:6004/eureka/
instance:
#实例主机
hostname: eureka6001.com
EurekaServerMain6001启动类的代码
package com.aliwo.eureka;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
/**
* package_name:com.aliwo.eureka
*
* @author:徐亚远 Date:2020/4/17 11:55
* 项目名:eureka-project
* Description:TODO
* Version: 1.0
**/
@SpringBootApplication
//开启注册中心
@EnableEurekaServer
public class EurekaServerMain6001 {
public static void main(String[] args) {
SpringApplication.run(EurekaServerMain6001.class, args);
}
}
Eureka-server6004项目的目录结构如图:
pom.xml文件的代码引入的依赖
<?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">
<parent>
<artifactId>eureka-project</artifactId>
<groupId>com.aliwo.eureka</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>eureka-server6004</artifactId>
<dependencies>
<!--eureka server-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
<!--boot web actuator-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!--一般通用配置 热部署工具-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
</dependency>
</dependencies>
</project>
EurekaServerMain6004启动类的代码
package com.aliwo.eureka;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
/**
* package_name:com.aliwo.eureka
*
* @author:徐亚远 Date:2020/4/18 9:27
* 项目名:eureka-project
* Description:TODO
* Version: 1.0
**/
@SpringBootApplication
@EnableEurekaServer
public class EurekaServerMain6004 {
public static void main(String[] args) {
SpringApplication.run(EurekaServerMain6004.class, args);
}
}
application.yml文件的配置
server:
port: 6004
spring:
application:
name: eureka-server6004
eureka:
client:
#是否将自己注进注册中心,默认为true
register-with-eureka: false
#是否从注册中心获取已有的注册信息,默认为true,单节点没有事,集群必须设置为true
fetch-registry: false
serviceUrl:
#配置eureka集群,相互配置相互观望
defaultZone: http://eureka6001.com:6001/eureka/
instance:
hostname: eureka6004.com
Eureka-client6002的项目结构如图:
pom.xml文件引入的依赖
<?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">
<parent>
<artifactId>eureka-project</artifactId>
<groupId>com.aliwo.eureka</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>eureka-client6002</artifactId>
<dependencies>
<!--eureka server-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<!--boot web actuator-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!--一般通用配置 热部署工具-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
</dependency>
</dependencies>
</project>
application.yml文件的配置信息
server:
port: 6002
spring:
application:
name: eureka-client6002
eureka:
client:
serviceUrl: #不使用service_url这个有小bug
#向哪个注册中心注册,单机配置
#defaultZone: http://localhost:6001/eureka/
#配置集群
defaultZone: http://eureka6001.com:6001/eureka,http://eureka6004.com:6004/eureka
#表示是否将自己注册进EurekaServer默认为true
register-with-eureka: true
#是否从EurekaServer抓取已有的注册信息,默认为true。单节点无所谓,集群必须设置为true才能配合ribbon使用负载均衡
fetch-registry: true
EurekaClientMain6002启动类的代码
package com.aliwo.eureka;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
/**
* package_name:com.aliwo.eureka
*
* @author:徐亚远 Date:2020/4/17 15:29
* 项目名:eureka-project
* Description:TODO
* Version: 1.0
**/
@SpringBootApplication
@EnableEurekaClient
public class EurekaClientMain6002 {
public static void main(String[] args) {
SpringApplication.run(EurekaClientMain6002.class, args);
}
}
EurekaClient6003项目的结构如图
pom.xml文件的依赖如下
<?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">
<parent>
<artifactId>eureka-project</artifactId>
<groupId>com.aliwo.eureka</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>eureka-client6003</artifactId>
<dependencies>
<!--eureka server-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<!--boot web actuator-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!--一般通用配置 热部署工具-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
</dependency>
</dependencies>
</project>
application.yml文件的配置信息如下
server:
port: 6003
spring:
application:
name: eureka-client6003
#该项目向哪个注册中心注册自己
eureka:
client:
serviceUrl: #不使用service_url这个有小bug
#向哪个注册中心注册
#defaultZone: http://localhost:6001/eureka/
#配置集群
defaultZone: http://eureka6001.com:6001/eureka,http://eureka6004.com:6004/eureka
#表示是否将自己注册进EurekaServer默认为true
register-with-eureka: true
#是否从EurekaServer抓取已有的注册信息,默认为true。单节点无所谓,集群必须设置为true才能配合ribbon使用负载均衡
fetch-registry: true
#eureka实例
instance:
#设置使用端口
prefer-ip-address: true
#服务的实例默认是 主机名称:服务的名称(spring.application.name):端口号,可以自己修改
instance-id: ${spring.application.name}:${server.port}
EurekaClientMain6003的启动类代码
package com.aliwo.eureka;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
/**
* package_name:com.aliwo.eureka
*
* @author:徐亚远 Date:2020/4/17 15:42
* 项目名:eureka-project
* Description:TODO
* Version: 1.0
**/
@SpringBootApplication
@EnableEurekaClient
public class EurekaClientMain6003 {
public static void main(String[] args) {
SpringApplication.run(EurekaClientMain6003.class, args);
}
}
项目的启动步骤,
第一步启动EurekaServerMain6001的启动类------>EurekaServerMain6004------>EurekaClientMain6002-------->EurekaClientMain6003
项目启动后的效果如图
eureka的集群搭建完成,源码我将上传到我的博客资源中,如有用到自己下载,最后,创作不易,转载请标明出处!!!