早些年常见的集中式系统和分布式系统:
集中式系统也叫单体应用,就是把所有应用的程序、功能、模块都集中在在一个项目当中,部署在一台服务器上对外使用
分布式系统就是把所有的程序、功能拆分成不同的子系统,部署在多台不同的服务器上,这些子系统相互协作对外提供服务,对用户而言他们不知道后台是多个子系统和多台服务器在服务,使用上和集中系统一样。
集中系统和分布式系统是相反的两个概念,他们的区别体现在“合”与“分”。
微服务优缺点:
微服务架构是将系统当中的不同模块拆分成多个不同的服务,这些服务进行独立的开发部署,每个服务都运行在自己的进程内,这样每个服务的更新都不会影响到其他服务的运行。
每个服务器都是单独运行部署的,我们可以更准确的监控每个服务的资源消耗情况,进行容量评估通过压力测试,也很容易发个各个服务器之间的瓶颈所在。
由于每个服务器都是独立开发,项目的开发相对于比较简便减少代码冲突,代码的冗余,逻辑处理更加清晰,让后续的维护更加容易,
微服务可以使用不同的编程语言进行开发(各个独立的服务器之间使用的是基于http的JSON作为通讯协作的基础)
缺点:
微服务架构增加了系统的维护、部署的难度,导致一些功能模块或者代码无法复用
随着系统使用率的日益增长,微服务在一定程度上也会导致系统变的越来越负责,增加了集成测试的难度
随着服务的增多,数据的一致性问题,服务之间的通讯成本都明显突出。
Spring Cloud 的整体架构
Service Provider: 暴露服务的服务提供方。
Service Consumer:调用远程服务的服务消费方。
EureKa Server: 服务注册中心和服务发现中心。
Spring Cloud项目的开始创建:
首先查看Spring Cloud官网如下描述:
将spring cloud加在已有的sping项目当中,如果你有存在的spring项目你想添加spring cloud在这个项目,首先应该确认使用的spring cloud版本,你在项目当中使用的版本取决去spring boot的版本。
下表概述了spring cloud版本对应spring boot的版本。
创建Spring Cloud基于Spring Boot的项目:
两种方式创建项目:
一、直接创建Spring Boot项目导入pom坐标
二、创建普通的java项目导入所需要的pom坐标
我们此次用的是第二种方式:
创建普通项目选择JAVA版本
输入GroupId和Artifactid不继承父工程
创建完成之后所需要导入的POM坐标:
<!--SpringBoot起步依赖-->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.3.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<dependencies>
<!--web项目需要引入的起步依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--SpringBootTest测试类依赖坐标-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!--Spring Cloud集合eureka客户端的起步依赖(提供者/消费者需要给注册中心注册所需要的包)-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<!--spring cloud集合eureka客户端的起步依赖(eureka注册中心需要导入的包)-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
<dependencies>
<!--SpringCloud所有依赖管理的坐标-->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Finchley.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<!--spring cloud包不能从maven下载这是配置包地址-->
<repositories>
<repository>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<url>https://repo.spring.io/libs-milestone/</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
提供者(provider)项目入口类和properties配置文件
入口类:
package com.nj.springcloud;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
@SpringBootApplication
@EnableEurekaClient
public class ApplicationProvider {
public static void main(String[] args) {
SpringApplication.run(ApplicationProvider.class, args);
}
}
配置文件application.properties
#spring boot内嵌tomcat改动端口
server.port=9100
#配置服务名称和注册中心地址
spring.application.name=01springcloudprovider
eureka.client.service-url.defaultZone=http://locathost:8761/eureka
#测试关闭自我保护机制,保证不可用服务被踢出
eureka.server.enable-self-preservation=false
#每间隔5秒向服务端发送一次心跳,证明自己仍然存活
eureka.instance.lease-renewal-interval-in-seconds=5
#告诉服务端如果10S之内没有发送心跳就代表故障了,将我踢出
eureka.instance.lease-expiration-duration-in-seconds=10
消费者(customer)项目入口类和properties配置文件
入口类:
package com.nj.springcloud;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
@SpringBootApplication
@EnableEurekaClient
public class ApplicationCustomer {
public static void main(String[] args) {
SpringApplication.run(ApplicationCustomer.class, args);
}
}
配置文件application.properties
server.port=8082
#配置服务名称和注册中心
spring.application.name=02springcloudservicecustom
eureka.client.service-url.defaultZone=http://erueka8761:8761/eureka,http://erueka8762:8762/eureka
#测试关闭自我保护机制,保证不可用服务被踢出
eureka.server.enable-self-preservation=false
#每间隔5秒向服务端发送一次心跳,证明自己仍然存活
eureka.instance.lease-renewal-interval-in-seconds=5
#告诉服务端如果10S之内没有发送心跳就代表故障了,将我踢出
eureka.instance.lease-expiration-duration-in-seconds=10
ribbo负载均衡配置:
package com.nj.springcloud.configer;
import com.netflix.loadbalancer.IRule;
import com.netflix.loadbalancer.RandomRule;
import com.netflix.loadbalancer.RetryRule;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;
/**
* @author
* @Description:
* @date 2020/12/21 21:40
*/
@Configuration //加@Configuration注解就相当于spring当中的spring-applicationContext.xml文件
public class SpringConfig {
/**
* Ribbon负载均衡,默认是轮询
* <bean id = "" class="">
* 在Spring Cloud当中,Ribbon主要与RestTemplate对象配合来使用,
* Ribbon会自动化配置RestTemplate对象,
* 通过@LoadBalabced注解开启RestTempalte对象调用时的负载均衡
* @return Ribbon默认负载均衡模式为轮询RoundRobinRule
*/
@LoadBalanced //开启RestTempalte对象调用时的负载均衡,开启客户端负载均衡
@Bean //@bean就相当于<bean id = "" class="">配置
public RestTemplate restTemplate(){
return new RestTemplate();
}
// @Bean
public IRule iRule(){
//随机负载均衡模式
// return new RandomRule();
//RetyRule先按照轮询策略分发,如果分发的服务不能访问,则在指定时间进行重试分发其他可用服务
return new RetryRule();
}
}
注册中心(server)项目入口类和properties配置文件
入口类:
package com.nj.springcloud;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
@SpringBootApplication
@EnableEurekaServer
public class ApplicationEurekaServer {
public static void main(String[] args) {
SpringApplication.run(ApplicationEurekaServer.class, args);
}
}
配置文件application.properties
#内置tomcat端口
server.port=8083
#配置注册中心hostname
eureka.instance.hostname=localhost
#由于目前创建的应用是一个服务注册中心,而不是普通的应用。默认情况下这个应用会向注册中心(及是自己)注册它自己
#设置为false表示禁止这种自己向自己注册的行为
eureka.client.register-with-eureka=false
#表示不去检索其他的服务,因为注册中心本身的职责就是维护服务实例,它不需要去检索其他的服务
eureka.client.fetch-registry=false
#指定注册中心位置
eureka.client.service-url.defaultZone=http://${eureka.instance.hostname}:${server.port}/eureka
以上就是一个Spring Cloud简单了解入门小测试完结!!!
Eureka与Zookpeer的比较
著名的CAP理论指出一个分布式系统不可能同时满足C(一致性)A(可用性)和P(分区容错性)。
由于分区容错性是分布式系统当中必须要保证的,因为我们只能在A和C之间进行选择,Zookeeper保证的是CP,Eureka保证的是AP。
Zookeeper保证的是CP:
在Zookeeper当中,当master节点因为网络故障和其他节点失去联系时,剩余的节点会重新进行Leader选择,问题在于选择Leader需要一定的时间,并且选举期间整个Zookeeper集群是不可用的,这就导致服务器在选举注册期间瘫痪。在云服务器上因网络问题使得Zookeeper集群失去master节点是大概率时间,虽然服务最终可以恢复,但是最终在选举期间会导致服务不可用是难以忍受的。
Eureka保证的是AP:
Eureka优先保证可用性,Eureka每个几点是平等的,挂掉几个节点不会影响正常的工作,剩余的节点依然可以提供注册和查询服务。而Eureka的客户端在向某个Eureka注册或发现连接失败,则会自动切换到其他节点,只要有一台Eureka服务端还在就能保证注册服务的可用(保证可用性),只不过查到的信息可能不是最新的(不保证强一致性)
eureka自我保护机制:
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/77256.html