SpringCloud详细宝典(上篇)

本文详述了SpringCloud的各个核心组件,包括初识Spring Cloud、服务调用方式、模拟微服务业务场景、注册中心Eureka以及负载均衡Ribbon。通过案例介绍了Eureka的搭建、服务注册与发现,以及Ribbon的负载均衡策略。此外,还探讨了Hystrix的熔断机制,防止服务雪崩效应。
摘要由CSDN通过智能技术生成

SpringCloud

  • 能够理解SpringCloud作用

    • 用来做微服务架构的技术解决方案
    • SpringCloud基于SpringBoot开发的,SpringCloud整合了很多优秀的第三方微服务开源框架
  • 能够使用RestTemplate发送请求

    • 封装了基于Rest的Http请求[实现Http请求]
    • 可以实现Java对象序列化与反序列化[序列化与反序列化]
  • 能够搭建Eureka注册中心

    • 用于管理服务、监控服务、服务路由
  • 项目注册:服务提供者注册、服务消费者注册、Eureka注册中心(Zookeeper)

  • 能够使用Ribbon负载均衡

    • 用来实现负载均衡(实现消费方负载均衡)
  • 能够使用Hystrix熔断器

    • 做服务降级,防止程序发生雪崩

1 初识Spring Cloud

大家谈起的微服务,大多来讲说的只不过是种架构方式。其实现方式很多种:Spring Cloud,Dubbo,华为的Service Combo,Istio 。

那么这么多的微服务架构产品中,我们为什么要用Spring Cloud?因为它后台硬、技术强、群众基础好,使用方便;

1.1 目标

  • 了解微服务架构
  • 了解SpringCloud技术

1.2 讲解

1.2.1 技术架构演变

(1)单一应用架构

当网站流量很小时,只需要一个应用,所有功能部署在一起,减少部署节点成本的框架称之为集中式框架。此时,用于简化增删改查工作量的数据访问框架(ORM)是影响项目开发的关键。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qQ24f8o9-1603329775928)(images\1563128795202.png)]

(2)垂直应用架构

当访问量逐渐增大,单一应用增加机器带来的加速度越来越小,将应用拆成互不相干的几个应用,以提升效率。此时,用于加速前端页面开发的Web框架(MVC)是关键。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gnj1sJAe-1603329775941)(images\1563128890388.png)]

(3)分布式服务架构

当垂直应用越来越多,应用之间交互不可避免,将核心业务抽取出来,作为独立的服务,逐渐形成稳定的服务中心,使前端应用能更快速的响应多变的市场需求。此时,用于提高业务复用及整合的分布式服务框架(RPC)是关键。

![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8UWfBTk3-1603329775943)(images\1563129132684.png)]](https://img-blog.csdnimg.cn/20201022092517696.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2R4ZHhkeDEx,size_16,color_FFFFFF,t_70#pic_

(4)面向服务(SOA)架构

典型代表有两个:流动计算架构和微服务架构;

流动计算架构:

当服务越来越多,容量的评估,小服务资源的浪费等问题逐渐显现,此时需增加一个调度中心基于访问压力实时管理集群容量,提高集群利用率。此时,用于提高机器利用率的资源调度和治理中心(SOA)是关键。流动计算架构的最佳实践阿里的Dubbo。

微服务架构

与流动计算架构很相似,除了具备流动计算架构优势外,微服务架构中的微服务可以独立部署,独立发展。且微服务的开发不会限制于任何技术栈。微服务架构的最佳实践是SpringCloud。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hGcCiYAn-1603329775946)(images\1563128667644.png)]

1.2.2 SpringCloud简介

(1)SpringCloud介绍

Spring Boot擅长的是集成,把世界上最好的框架集成到自己项目中

Spring Cloud本身也是基于SpringBoot开发而来,SpringCloud是一系列框架的有序集合,也是把非常流行的微服务的技术整合到一起,是属于微服务架构的一站式技术解决方案。

Spring Cloud包含了:

注册中心:Eureka、consul、Zookeeper

负载均衡:Ribbon

熔断器:Hystrix

服务通信:Feign

网关:Gateway

配置中心 :config

消息总线:Bus

集群状态等等…功能。

Spring Cloud协调分布式环境中各个微服务,为各类服务提供支持。

(2)Spring Cloud的版本

在这里插入图片描述

版本说明:

SpringCloud是一系列框架组合,为了避免与框架版本产生混淆,采用新的版本命名方式,形式为大版本名+子版本名称
  大版本名用伦敦地铁站名
  子版本名称三种
    SNAPSHOT:快照版本,尝鲜版,随时可能修改
    M版本,MileStone,M1表示第一个里程碑版本,一般同时标注PRE,表示预览版
    SR,Service Release,SR1表示第一个正式版本,同时标注GA(Generally Available),稳定版

(3)SpringCloud与SpringBoot版本匹配关系

SpringBoot SpringCloud
1.2.x Angel版本
1.3.x Brixton版本
1.4.x Camden版本
1.5.x Dalston版本、Edgware
2.0.x Finchley版本
2.1.x Greenwich GA版本 (2019年2月发布)

鉴于SpringBoot与SpringCloud关系,SpringBoot建议采用2.1.x版本

1.3 小结

  • 微服务架构:就是将相关的功能独立出来,单独创建一个项目,并且连数据库也独立出来,单独创建对应的数据库。本质:将相关独立的业务完全独立出来,对应的工程和数据库也完全独立出来。
  • Spring Cloud本身也是基于SpringBoot开发而来,SpringCloud是一系列框架的有序集合,也是把非常流行的微服务的技术整合到一起。

2 服务调用方式

2.1 目标

  • 理解RPC和HTTP的区别
  • 能使用RestTemplate发送请求(发送Http请求)

2.2 讲解

2.2.1 RPC和HTTP

常见远程调用方式:

RPC:(Remote Produce Call)远程过程调用

1.基于Socket
2.自定义数据格式
3.速度快,效率高
4.典型应用代表:Dubbo,WebService,ElasticSearch集群间互相调用

HTTP:网络传输协议

1.基于TCP/IP
2.规定数据传输格式
3.缺点是消息封装比较臃肿、传输速度比较慢
4.优点是对服务提供和调用方式没有任何技术限定,自由灵活,更符合微服务理念

RPC和HTTP的区别:RPC是根据语言API来定义,而不是根据基于网络的应用来定义。

Http客户端工具

常见Http客户端工具:HttpClient(发送Http请求)、OKHttp(发送Http请求)、URLConnection(发送Http请求)。

2.2.2 Spring的RestTemplate

(1)RestTemplate介绍

  • RestTemplate是Rest的HTTP客户端模板工具类
  • 对基于Http的客户端进行封装
  • 实现对象与JSON的序列化与反序列化(JSON<->JavaBean)
  • 不限定客户端类型,目前常用的3种客户端都支持:HttpClient、OKHttp、JDK原生URLConnection(默认方式)

(2)RestTemplate入门案例

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7vOB5d4j-1603329775950)(images\1563020200215.png)]

我们可以使用RestTemplate实现上图中的请求,springcloud-day1-resttemplate通过发送请求,请求springcloud-day1-provider/user/list方法。

(1)搭建springcloud-day1-provider

这里不演示详细过程了,大家直接使用IDEA搭建一个普通的SpringBoot工程即可。

坐标

<groupId>com.itheima</groupId>
<artifactId>springcloud-day1-provider</artifactId>
<version>0.0.1-SNAPSHOT</version>

pom.xml依赖

<!--父工程-->
<parent>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-parent</artifactId>
	<version>2.1.6.RELEASE</version>
	<relativePath/> <!-- lookup parent from repository -->
</parent>

<dependencies>
	<!--web起步依赖-->
	<dependency>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-web</artifactId>
	</dependency>
</dependencies>

创建com.itheima.domain.User

public class User implements Serializable {
   
    private String name;
    private String address;
    private Integer age;

    public User() {
   
    }

    public User(String name, String address, Integer age) {
   
        this.name = name;
        this.address = address;
        this.age = age;
    }
    
    //..get set toString 略
    
}

application.properties

server.port=18081

创建com.itheima.controller.UserController,代码如下:

@RestController
@RequestMapping(value = "/user")
public class UserController {
   

    /***
     * 提供服务
     * @return
     */
    @RequestMapping(value = "/list")
    public List<User> list(){
   
        List<User> users = new ArrayList<User>();
        users.add(new User("王五", "深圳", 25));
        users.add(new User("李四", "北京", 23));
        users.add(new User("赵六", "上海", 26));
        return users;
    }
}

创建启动类,并启动工程

@SpringBootApplication
public class SpringcloudDay1ProviderApplication {
   
	public static void main(String[] args) {
   
		SpringApplication.run(SpringcloudDay1ProviderApplication.class, args);
	}
}

访问:<http://localhost:18081/user/list>效果如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-f3LfwfI2-1603329775952)(images\1563020871025.png)]

(2)创建springcloud-day1-resttemplate

创建的详细过程也不讲解了,直接使用IDEA创建一个SpringBoot工程即可。

pom.xml依赖

<!--父工程-->
<parent>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-parent</artifactId>
	<version>2.1.6.RELEASE</version>
	<relativePath/> <!-- lookup parent from repository -->
</parent>

<dependencies>
	<!--web起步依赖-->
	<dependency>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-web</artifactId>
	</dependency>

	<!--测试包-->
	<dependency>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-test</artifactId>
		<scope>test</scope>
	</dependency>
</dependencies>

创建启动类,并在启动类中创建RestTemplate对象

@SpringBootApplication
public class SpringcloudDay1ResttemplateApplication {
   

	public static void main(String[] args) {
   
		SpringApplication.run(SpringcloudDay1ResttemplateApplication.class, args);
	}

	/***
	 * @Bean:创建一个对象实例,并将对象交给Spring容器管理
	 * <bean id="restTemplate" class="org.springframework.web.client.RestTemplate" />
	 * @return
	 */
	@Bean
	public RestTemplate restTemplate(){
   
		return  new RestTemplate();
	}
}

测试

在测试类HttpDemoApplicationTests中@Autowired注入RestTemplate

通过RestTemplate的getForObject()方法,传递url地址及实体类的字节码

RestTemplate会自动发起请求,接收响应

并且帮我们对响应结果进行反序列化

代码如下:

@RunWith(SpringRunner.class)
@SpringBootTest
public class SpringcloudDay1ResttemplateApplicationTests {
   
	@Autowired
	private RestTemplate restTemplate;

	/****
	 * RestTemplate远程调用
	 */
	@Test
	public void testRestTemplateQuery() {
   
		String url = "http://localhost:18081/user/list";
		String result = restTemplate.getForObject(url, String.class);
		System.out
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值