什么是微服务,SpringCloud和Eureka

一.引言

1.什么是SpringCloud

  • SpringCloud是一套微服务开发一站式解决方案,它提供了微服务开发的很多功能组件,比如服务统一管理,配置,路由网关,断路器,集群状态配置等等。而且SpringCloud与SprigBoot五分衔接,配合SpringBoot能够更轻松的搭建出一套微服务架构平台。

2.什么是微服务

  • 微服务其实就是一种架构设计风格,并没有明确的技术绑定和架构概念。简单来说,微服务架构风格其实就是将原来的单一架构开发为一组小型服务(微服务)的方法,每个服务都运行在自己独立的进程中(服务间的隔离),服务间采用轻量级的通讯机制(Http,RPC-Netty,WebService),这些服务按照业务拆分,并且独立部署(自动化部署)。服务会有一个统一的管理这中心(Zookeeper,Eureka,Nacos),服务可以采用不同的语言开发,并且使用不同的存储技术(数据库垂直拆分)

二,服务的注册与发现-Eureka

问题:为什么需要注册中心
如果没有注册中心,服务和服务之间会形成硬耦合状态
注册中心的作用就是为了减少服务间的调用耦合
在这里插入图片描述
1.Eureka对比Zookeeper
在这里插入图片描述
2.Eureka服务端的搭建
2.1配置自定义的父工程(继承Spring Boot,SpringCloud)
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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <packaging>pom</packaging>
    <modules>
        <module>springcloud_eureka</module>
        <module>springcloud_microservice_student</module>
    </modules>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.9.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.qfedu</groupId>
    <artifactId>springcloud_demo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
   <!-- <name>springcloud_demo</name>
    <description>Demo project for Spring Boot</description>-->

    <properties>
        <java.version>1.8</java.version>
        <spring-cloud.version>Greenwich.SR5</spring-cloud.version>
    </properties>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

</project>

2.2

  1. 创建一个Maven工程(Eureka微服务),继承自定义的父工程
  2. 修改当前maven工程的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>springcloud_demo</artifactId>
        <groupId>com.qfedu</groupId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>springcloud_eureka</artifactId>

    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>
  1. 配置当前SpringBoot的启动类、
package com.qfedu.application;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;

@SpringBootApplication
@EnableEurekaServer
public class EurekaServiceApplication {

    public static void main(String[] args) {
    //run的第一个参数一定是添加了@SpringBootApplication注解的类 //不是当前类
        SpringApplication.run(EurekaServiceApplication.class,args);
    }
}

  1. 配置application.yml-
server:
  port: 20000
spring:
  application:
    #配置微服务的名称,以后所有的微服务,都必须配置这个属性,不然注册中心的名字会变成unable
    name: eureka-server
#配置eureka的相关属性
eureka:
  client:
    service-url:
      #配置eureka的注册地址
      #defaultZone没有提示,必须手写
      defaultZone: http://eureka1:20000/eureka,http://eureka2:20001/eureka,http://eureka3:20002/eureka
    #当前的微服务就是注册中心,注册中心不能从注册中心抓取服务,所以该配置需要配置成false
    fetch-registry: false
    #使得当前的微服务不注册到注册中心上
    register-with-eureka: false
  1. 启动SpringBoot工程-启动Eureka服务段
  2. 访问注册中心,

3.微服务(Eureka客户端)的搭建

3.1 Eureka客户端的搭建

  1. 创建一个Maven工程,继承springcloud工程
  2. 配置Maven的工程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>springcloud_demo</artifactId>
        <groupId>com.qfedu</groupId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>springcloud_microservice_student</artifactId>


    <dependencies>
        <!--微服务需要对外提供功能-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <!--同时为了能够让微服务注册到注册中心上-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>
  1. 配置启动类
    StudentApplication.java
package com.qfedu.application;


import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;

@SpringBootApplication(scanBasePackages = "com.qfedu")
@EnableEurekaClient
public class StudentApplication {

    public static void main(String[] args) {
        SpringApplication.run(StudentApplication.class,args);
    }
}
  1. 配置application.yml
server:
  port: 8080
#微服务名字:名字不要用下划线
spring:
  application:
    name: micro-student
eureka:
  client:
    service-url:
      #现在配置的是微服务 配置注册中心的地址 因为微服务需要注册 也需要抓取服务,所以另外两个不配了
      defaultZone: http://eureka1:20000/eureka
  1. 编写微服务的功能接口(根据微服务本身的业务不同,编写不同的接口)
package com.qfedu.controller;


import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/stu")
public class StuController {

    @RequestMapping("/queryName")
    public String getNameById(Integer sid){
        switch (sid){
            case 1:
                return "小明";
            case 2:
                return "小花";
            default:
                return "无";
        }
    }
}

4.Eureka的集群

4.1eureka集群的工作模式
在这里插入图片描述
4.2 Eureka集群的集群(伪集群)

  1. 将eureka服务端复制2份
  2. 修改eureka服务的端口(因为是伪集群,在一台机器上,需要修改端口)
  3. 找到本机的hosts文件,分别给本机设置3哥主机名

在这里插入图片描述
4.修改3个eureka服务的service-url配置

server:
  port: 20000
spring:
  application:
    #配置微服务的名称,以后所有的微服务,都必须配置这个属性,不然注册中心的名字会变成unable
    name: eureka-server
#配置eureka的相关属性
eureka:
  client:
    service-url:
      #配置eureka的注册地址
      #defaultZone没有提示,必须手写
      defaultZone: http://eureka1:20000/eureka,http://eureka2:20001/eureka,http://eureka3:20002/eureka
    #当前的微服务就是注册中心,注册中心不能从注册中心抓取服务,所以该配置需要配置成false
    fetch-registry: false
    #使得当前的微服务不注册到注册中心上
    register-with-eureka: false

5.Eureka的自我保护机制

5.1什么是Eureka的自我保护机制

  • Eureka如果收到的微服务心跳相对于应该受到的微服务心跳来说。如果低于了85%,那么就会触发Eureka的自我保护机制。一旦自我保护机制启动,Eureka会保护所有的微服务,不被移除,哪怕当前为服务器已下线,仍然会保护到Eureka微服务列表中。

5.2自我保护机制的作用
为什么Zookeeper要设计一个过半数存活原则?感觉特别浪费资源?为了让整个集群一定只有一个Leader
CAP原则:任何一个分布式系统,都只能满足CAP中的2原则,因为分区问题不可避免,所以P是必须的,一般的系统,都是从C和A中做选择。Zookeeper是CP设计,而EureKa是AP设计。
C(一致性)
A(可用性)
P(分区容错性)
思考:Eureka的自我保护机制,虽然是为了保证服务的高可用,但是如果服务真的挂掉了?那么
也被自我保护起来,是不是有问题呢?
自我保护机制一旦启动,确实会保护那些真的出问题的微服务,所以Eureka设计了一个阈值,当
15%的心跳都丢失的时候,才会发生自我保护机制。因为这个时候,相对于15%的机器挂掉来
说,发生脑裂的概率大一些。但是有没有可能真的是15%机器挂掉了?这个时候Eureka是不能帮
我们判断的,需要客户端本身有一定的容错机制,比如断路器
思考:CP设计好?还是AP设计好? - 取决于业务,对于注册中心来说,偶尔拿到出问题的微服
务,其实对于整个架构来讲没有太大问题,微服务架构最害怕整个注册中心服务不可用,因此对
于注册中心来说,AP(高可用)设计强于CP(一致性)设计。并不是说一致性不好,对于分布式
锁的业务来讲,一定要CP,不然整个集群的业务会混乱
注意:zookeeper可以是偶数台,只是说奇数台,服务器成本更低一些

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值