springcloud学习

1.单体应用架构存在的问题

一个归档包(例如war)包含所有功能的应用程序,通常称为单体应用。
在这里插入图片描述
相信很多项目都是从单体应用开始的,单体应用比较容易部署和测试,项目的初期,项目可以很好的运行,然而,
随着需求的不断增加,越来越多的人加入到开发团队,代码库也在飞速的膨胀,慢慢的单体应用变得越来越臃肿,
可维护性,灵活性逐渐降低,维护的成本越来越高,以下列举单体架构中存在的问题:

  • 复杂性高:定时炸弹
  • 技术债务:no broken don’t fix
  • 可靠性差:单个bug,导致整个系统瘫痪阻碍技术创新

2.架构的演变

在这里插入图片描述
the microservice architectural style [1] is an approach to developing a single application as a suite of small
services, each running in its own process and communicating with lightweight mechanisms, often an HTTP
resource API. These services are built around business capabilities and independently deployable by fully
automated deployment machinery. There is a bare minimum of centralized management of these services,
which may be written in different programming languages and use different data storage technologies.(假装自己能看懂)

  • 由一系列微小的服务组成
  • 每个服务独立运行在自己的进程中
  • 独立部署
  • 基于分布式的管理
官网链接:https://www.martinfowler.com/articles/microservices.html

4.微服务的解决方案

在这里插入图片描述

5.什么是springcloud

Spring Cloud是一个含概多个子项目的开发工具集,集合了众多的开源框架,他利用了Spring Boot开发的便利性实现
了很多功能,如服务注册,服务注册发现,负载均衡等.Spring Cloud在整合过程中主要是针对Netflix(耐非)开源组件的
封装.
NetFlix 是美国的一个在线视频网站,微服务业的翘楚,他是公认的大规模生产级微服务的杰出实践者,NetFlix的开源
组件已经在他大规模分布式微服务环境中经过多年的生产实战验证,因此spring cloud中很多组件都是基于NetFlix组
件的封装.
Spring Cloud的出现真正的简化了分布式架构的开发

6.springcloud的特点

  • 服务注册和发现
  • 路由service - to - service调用
  • 负载均衡
  • 断路器

7.Spring Cloud 的服务架构图

在这里插入图片描述

8.Eureka组件

Eureka是Netfilx开源的服务发现组件,本身是一个基于rest的服务,它包含client和server两部分。
Spirng Cloud将它集成在子项目Spirng Cloud Netfilx中,从而实现服务的注册和发现

1.eureka中的server和client的介绍及特点
  • Eureka Server:提供服务发现的能力,各个微服务启动时,会向Eureka Server注册自己的信息例如(IP,端口号,服务名称等),Eureka会存储这些信息
  • Eureka Client:是一个java的客户端用来简化Eureka Server的交互
  • 微服务启动后会周期性的(默认30秒)向Eureka Server发送心跳,如果Eureka在规定的时间没有收到心跳,则会注销该实例(默认90秒)
  • Eureka Client会缓存服务注册表中的信息。这种方式有一定的优势首先可以降低Eureka Server的压力,其次当所有的Eureka Server宕机服务调用方依然可以完成调用
2.服务注册与服务发现
  • 服务注册:当微服务client启动时,向Eureka Server发起注册,并上报该节点的相关信息
  • 服务发现:client从Eureka Server获取注册信息,然后发起调用
3.Eureka Server开发
1.引入springcloud的相关依赖
<?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.baizhi</groupId>
   <artifactId>springcloud_regist</artifactId> 
   <version>1.0-SNAPSHOT</version> 
   <name>springcloud_regist</name> 
   <url>http://www.example.com</url> 

   <properties>
         <project.build.sourceEncoding>UTF8</project.build.sourceEncoding>
         <maven.compiler.source>1.8</maven.compiler.source>
         <maven.compiler.target>1.8</maven.compiler.target> 
    </properties> 
<!--引入springboot的父项目--> 
    <parent> 
        <groupId>org.springframework.boot</groupId> 
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.7.RELEASE</version> 
     </parent> 

      <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>
 </project>
2.入口类的开发
@EnableEurekaServer 
@SpringBootApplication 
public class EurekaServer { 
     public static void main(String[] args) {
           SpringApplication.run(EurekaServer.class,args);
      } 
}
eureka.client.service-url.defaultZone=http://localhost:8761/eureka
eureka.client.register-with-eureka=false 
eureka.client.fetch-registry=false
spring.application.name=eureka server.port=8761
4.Eureka Client的开发
  1. jar包和Server相同
将spring-cloud-starter-eureka-server改为spring-cloud-starter-eureka
 <dependency> 
 <groupId>org.springframework.cloud</groupId> 
 <artifactId>spring-cloud-starter-eureka</artifactId>
 </dependency>
  1. 入口类
@EnableDiscoveryClient 
@SpringBootApplication 
public class HiApplication 
{ 
public static void main(String[] args) {
SpringApplication.run(HiApplication.class, args);
   } 
 }
  1. 配置文件
server.port=8989 
eureka.client.service-url.default-zone=http://localhost:8761/eureka spring.application.name=hi 
eureka.instance.prefer-ip-address=true
5.Eureka client之间的相互调用
  1. 导入相关的jar
    和eureka server 一致
  2. java配置RestTemplate
@Bean 
@LoadBalanced RestTemplate getRestTemplate(){ 
return new RestTemplate(); 
} 
  1. 调用
@Autowired 
RestTemplate restTemplate; 
@RequestMapping("/hi") 
public String hi(String name) { 
String restTemplateForObject = restTemplate.getForObject("http://服务名/test/test? name=" + name, String.class); 
return restTemplateForObject; 
}
6.Eureka的自我保护机制

Eureka进入自我保护机制的最直接体现,是Eureka首页输出警告如图:
在这里插入图片描述
默认情况下,如果Eureka Server在一定时间内没有接受到服务实例的心跳,Eureka将会注销该实例(默认90秒).但
是当网络分区发生故障时,微服务和Eureka Server 无法正常通信.以上行为可能变得特别危险了-因为微服务本身
是健康的,此时不能注销该服务实例.
Eureka通过自我保护机制来解决这个问题,当Eureka Server在短时间丢失过多的服务实例(可能发生了网络分区
的故障,那么这个节点进入自我保护模式,一旦进入此模式,Eureka Server将会保护服务注册表中的信息,不再
删除服务注册表中的数据(也就是不再注销任何的服务实例),当网络故障恢复后,Eureka会自动退出自我保护模
式。
综上,自我保护模式是一种应对网络故障的安全保护措施,它的架构哲学是宁可同时保留所有的微服务,也不盲目
注销任何健康的微服务,使用自我保护模式可以让Eureka,更加健壮,稳定。

在springcloud中可以通过

#关闭自我保护机制 默认开启 
eureka.server.enable-self-preservation=false
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值