Spring Cloud快速入门学习

早些年常见的集中式系统和分布式系统:
  集中式系统也叫单体应用,就是把所有应用的程序、功能、模块都集中在在一个项目当中,部署在一台服务器上对外使用
  分布式系统就是把所有的程序、功能拆分成不同的子系统,部署在多台不同的服务器上,这些子系统相互协作对外提供服务,对用户而言他们不知道后台是多个子系统和多台服务器在服务,使用上和集中系统一样。
集中系统和分布式系统是相反的两个概念,他们的区别体现在“合”与“分”。

微服务优缺点:

  微服务架构是将系统当中的不同模块拆分成多个不同的服务,这些服务进行独立的开发部署,每个服务都运行在自己的进程内,这样每个服务的更新都不会影响到其他服务的运行。
  每个服务器都是单独运行部署的,我们可以更准确的监控每个服务的资源消耗情况,进行容量评估通过压力测试,也很容易发个各个服务器之间的瓶颈所在。
  由于每个服务器都是独立开发,项目的开发相对于比较简便减少代码冲突,代码的冗余,逻辑处理更加清晰,让后续的维护更加容易,
  微服务可以使用不同的编程语言进行开发(各个独立的服务器之间使用的是基于http的JSON作为通讯协作的基础)
缺点:
  微服务架构增加了系统的维护、部署的难度,导致一些功能模块或者代码无法复用
  随着系统使用率的日益增长,微服务在一定程度上也会导致系统变的越来越负责,增加了集成测试的难度
  随着服务的增多,数据的一致性问题,服务之间的通讯成本都明显突出。

Spring Cloud 的整体架构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 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自我保护机制:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值