Spring cloud应该怎么入门?

论坛 期权论坛 知乎     
知乎用户   2019-8-14 01:10   2069   5
转载声明:本文由互联网用户自发贡献,部分转载来源来自知乎(zhihu.com),强烈建议您访问知乎查看完整内容。本社区不拥有所有权,也不承担任何法律责任。如有侵权,请联系optbbs@163.com。一经查实,即刻删除。
学习spring cloud的先修课程都有哪些,以及有什么有效的学习方法?看视频看博客还是直接看官方文档
分享到 :
0 人收藏

5 个回复

倒序浏览
热心回应  16级独孤 | 2019-8-14 01:10:05


[h1]《史上最简单的 SpringCloud 教程》系列:[/h1][h2]Finchley版本[/h2]Spring Cloud Finchley; Spring Boot 2.0.3
[h2]D版本[/h2][h2]Spring Cloud Alibaba教程[/h2][h2]Greenwich版本[/h2][h2]源码篇:[/h2][h2]进阶篇[/h2][h2]番外篇:[/h2]
热心回应  16级独孤 | 2019-8-14 01:10:06
热心回应  16级独孤 | 2019-8-14 01:10:07
1 概述
Spring Cloud基于Spring Boot,提供了多个组件来帮助企业进行微服务系统建设;它提供的主要功能有:服务注册中心/服务注册/服务调用/负载均衡/断路器等;一般情况下它都是使用已有的开源软件,在其基础上按Spring Boot的理念来进行封装,简化各种个组件的调用以及各个组件之间的交互。
2 常用组件
Spring Cloud主要包含以下常用组件:
2.1 Eureka
分成两类,一是注册中心及EurekaServer,用于提供服务注册/服务申请等功能;
一是被注册者及服务提供者EurekaClient,用于向EurekaServer注册服务并可从EurekaServer获取需要调用的服务地址信息;
需要向外提供服务的应用,需要使用EurekaClient来向Server注册服务。
2.2 Ribbon
负责进行客户端负载均衡的组件;一般与RestTemplate结合,在访问EurekaClient提供的服务时进行负载均衡处理。
也就是说,Ribbon用于服务调用者向被调用者进行服务调用,并且如果服务者有多个节点时,会进行客户端的负载均衡处理;
2.3 Feign
与Ribbon功能类型,用于调用方与被调用方的服务调用,同时进行客户端负载均衡的处理;不过它能提供类似本地调用的方式调用远程的EurekaClient提供的服务;它实际上是在Ribbon基础上进行了进一步的封装来提高调用服务的简便性。
2.4 待补充
3 使用示例
3.1 示例场景
假设现在有SERVICEAPP1向外提供服务,该服务同时部署两个节点;Client通过Feign或者是Ribbon调用其提供的服务,其部署关系及数据流向图如下所示:

第一步:启动注册中心;服务提供者及调用者向服务中心注册;
第二步:服务调用者向服务中心申请服务,根据服务中心返回的地址信息调用服务提供者提供的服务;
第三步:注册中心通过心跳检测方式检测服务提供者的状态,当某个提供者连接不上时,发送消息通知所有注册者;
下面详细说明每个节点的实现; 具体代码见https://github.com/icarusliu/learnSpringCloud
3.2 Eureka服务端
详细代码见GITHUB工程中名为EurekaServer的模块;
a. MVN依赖引入
引入EurekaServer相关的依赖包
  1.     org.springframework.cloud    spring-cloud-starter-netflix-eureka-server
复制代码
b. Spring Boot注解引入及服务启动类
主要是通过EnableEurekaServer来表明节点是服务端。
  1. @SpringBootApplication@EnableEurekaServerpublic class EurekaServerApplication {    public static void main(String[] args) {        SpringApplication.run(EurekaServerApplication.class, args);    }}
复制代码
c. Application.yml配置
主要是配置端口及配置是否向服务中心注册及向服务中心获取注册信息;
这两项配置均需配置成false; 单纯的做服务器的节点不需要再向服务器注册及申请注册信息。
  1. server:  port: 8761eureka:  instance:    hostname: localhost  client:    # 以下两项一定要是false,表明自己是服务器,而不需要从其他主机发现服务    registerWithEureka: false    fetchRegistry: false    serviceUrl:      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/  server:    waitTimeInMsWhenSyncEmpty: 0
复制代码
启动完后通过http://localhost:8761/可以看到EurekaServer的监控页面; 此时还没有节点注册;
[h1]3.3 服务提供方[/h1]详细代码见GITHUB工程中名为ServiceApp1的模块;
a. MVN依赖引入
需要引入EurekaClient相关的依赖包;
  1.     org.springframework.cloud    spring-cloud-starter-netflix-eureka-client
复制代码
b. 注解引入
通过EnableEurekaClient注册表明其是EurekaClient;
该注解会使得应用向EurekaServer进行注册,同时获取EurekaServer上所注册的所有应用信息; 这些注册信息通过自动注入的EurekaClient类可以获取到。
  1. @SpringBootApplication@EnableEurekaClient@RestControllerpublic class ServiceApp1Application {    @Autowired    private EurekaClient client;    public static void main(String[] args) {        SpringApplication.run(ServiceApp1Application.class, args);    }    @RequestMapping("/info")    public String test() {        return "test";    }    @RequestMapping("/test")    public String testClient() {        InstanceInfo instanceInfo = client.getNextServerFromEureka("SERVICEAPP1", false);        return instanceInfo.getHomePageUrl();    }}
复制代码
c. application.yml配置
配置端口/EurekaServer地址信息以及本服务名称;
同一应用可部署在多个节点时,或者在本地通过修改此处的端口可启动多次ServiceApp1Application 中的main方法; 此时会启动多个提供同一服务的服务节点; 如果启动多次时spring.application.name是不一样的,那么EurekaServer将会将它们当成是不同的服务;
  1. server:  port: 8080eureka:  client:    serviceUrl:      defaultZone: http://localhost:8761/eureka/spring:  application:    name: serviceApp1
复制代码
启动main函数后,通过http://localhost:8761可以看到已经有节点注册;
如果要启动多个节点做负载均衡,可以修改application.yml中的端口信息后再次启动main函数就可以了。
3.4 服务调用方
3.4.1 通过EurekaClient调用
详细代码见GITHUB工程中名为ServiceApp1的模块;
通过EnableEurekaClient进行服务注册的服务提供方的应用中,也可以通过注入EurekaClient的方式来调用其它服务提供方注册的服务,其使用方式如下:
  1. @RestControllerpublic class TestController {    @Autowired    private EurekaClient client;    @RequestMapping("/test")    public String testClient() {        InstanceInfo instanceInfo = client.getNextServerFromEureka("SERVICEAPP1", false);        return instanceInfo.getHomePageUrl();    }}
复制代码
[h1]3.4.2 通过Ribbon调用服务[/h1]Ribbon是一个客户端负载均衡器;如Redware等均是服务器端的负载均衡器;而Ribbon的负载均衡发生在客户端上。
详细代码见RibbonClient模块;
a. 依赖
  1.     org.springframework.cloud    spring-cloud-starter-eureka    1.3.0.RC1    org.springframework.cloud    spring-cloud-starter-netflix-ribbon
复制代码
b. 注解引入及RestTemplate注入
主要是通过EnableDiscoveryClient注解来向EurekaServer注册/获取注册信息; 此时可以通过RestTemplate来调用远程服务。
  1. @SpringBootApplication@EnableDiscoveryClientpublic class RibbonClientApplication {    public static void main(String[] args) {        SpringApplication.run(RibbonClientApplication.class, args);    }    @Bean    @LoadBalanced    RestTemplate restTemplate() {        return new RestTemplate();    }}
复制代码
c. application.yml配置
  1. server:  port: 8091eureka:  client:    serviceUrl:      defaultZone: http://localhost:8761/eureka/spring:  application:    name: ribbon-client
复制代码
d. 服务调用
  1. @RestControllerpublic class TestController {    @Autowired    private RestTemplate restTemplate;    @RequestMapping("/test")    public String test() {        return restTemplate.getForEntity("http://SERVICEAPP1/test", String.class).getBody();    }}
复制代码
启动main函数后通过EurekaServer的监控页面可以看到有两个节点已经注册到EurekaServer上了。
这里会有点奇怪,此处主要是通过Ribbon来调用其它节点提供的服务,这个客户端应用为什么要注册到EurekaServer中去?
它主要是基于以下考虑:客户端应用向EurekaServer注册后,它就可以获取EurekaServer上的所有注册服务信息,并将其缓存到本地; 这样就不需要每次调用某个节点的服务都先去EurekaServer上获取该服务的地址信息; 而且注册还有个好处,假设某个服务提供者挂掉了,而新启动了一个新IP端口的节点提供同时的服务,那么EurekaServer可以通知所有注册的节点说集群中出现了这样变化,请更新本地缓存;因此客户端应用就可以去新的服务器调用服务, 而不是去已经挂掉的节点调用服务。
通过http://localhost:8091/test可以看到执行结果。
[h1]3.4.3 通过Feign调用服务[/h1]Feign与Ribbon功能类似,它们的不同只是Feign在调用上进行了进一步的封装。
a. 依赖
  1.     org.springframework.cloud    spring-cloud-starter-eureka    2.0.0.M2    org.springframework.cloud    spring-cloud-starter-feign    2.0.0.M2
复制代码
b. 启动服务
相对Ribbon来说多了EnableFeignClients注解。
  1. @SpringBootApplication@EnableDiscoveryClient@EnableFeignClientspublic class FeignClientApplication {    public static void main(String[] args) {        SpringApplication.run(FeignClientApplication.class, args);    }}
复制代码
c. RemoteClient定义
通过Feign调用服务时,主要是利用FeignClient注解指定需要调用的服务在哪类节点上;这个注解作用在接口上; 与RequestMapping结合使用,这样就可以指定接口的某个方法调用的是远程服务器的哪个接口。
  1. @FeignClient("SERVICEAPP1")public interface RemoteClient {    @RequestMapping(method = RequestMethod.GET, value = "/test")    String test();}
复制代码
d. application.yml配置
  1. server:  port: 8093eureka:  client:    serviceUrl:      defaultZone: http://localhost:8761/eureka/spring:  application:    name: feign-clientfeign:  hystrix:    enabled: true
复制代码
e. 服务调用
通过预先定义好的RemoteClient类来调用远程服务器的相应接口;
  1. @RestControllerpublic class TestController {    @Autowired    private RemoteClient remoteClient;    @RequestMapping("/test")    public String test() {        return remoteClient.test();    }}
复制代码
启动main方法后,通过EurekaServer的监控页面可以看到又多了一个名称为FEIGN-CLIENT的节点; 为什么会多这个节点与Ribbon方式访问时多一个注册节点的原因是一样的。
此时可以通过http://localhost:8093/test来查看执行结果。
问题
1 使用Feign来调用服务时,报以下错误:com.netflix.client.ClientException: Load balancer does not have available server for client
原因是手贱将spring-cloud-starter-eureka的依赖给去掉了,添加上去即可:
  1.     org.springframework.cloud    spring-cloud-starter-eureka    2.0.0.M2
复制代码
否则Feign客户端将无法注册到Eureka服务器并且调用其它节点提供的服务。附上spring cloud全套视频教程。
SpringCloud微服务实践|Spring Cloud视频课程 - 蛙课视频
热心回应  16级独孤 | 2019-8-14 01:10:08
谢邀:在这里我引用一下大神的学习步骤供你参考
作者:lzhou666
转:7天学会spring cloud教程
按照官方的话说:Spring Cloud 为开发者提供了在分布式系统(如配置管理、服务发现、断路器、智能路由、微代理、控制总线、一次性 Token、全局锁、决策竞选、分布式会话和集群状态)操作的开发工具。最关键的是它足够简单,一般的开发人员只需要几天时间就可以学会它的基本用法。
  本Spring Cloud 7天系列教程,包括7个例子和相关短文,都是最简单的用法,也是默认最基本的用法,在实际生产环境中也可以用上,当然是初步使用。
  项目开源地址:http://git.oschina.net/zhou666/spring-cloud-7simple
     7个例子包括:
         1)一个基本的spring boot应用。
         2)分布式配置管理服务端
         3)分布式配置管理客户端(微服务应用)
         4)服务注册服务端
         5)服务注册发现客户端(微服务应用)
         6)spring boot风格的web前端应用
         7)使用docker发布应用
         7天学习周期如下:
         第1天:查看spring boot官方文档,实现及实验spring boot 应用。
         第2天:熟读spring cloud官方文档配置管理部分并熟悉配置管理相关概念。
         第3天:熟悉Git概念,并上传配置文件到Git服务器,最后实现分布式配置管理。
        第4天:熟读spring cloud官方文档服务注册部分,实现服务注册及发现。
        第5天:熟读spring cloud官方文档剩余部分,并实现断路器。
        第6天:深入spring boot相关概念,使用angularJS实现web前端应用。
        第7天:了解docker概念,并结合spring boot搭建一个docker应用。
热心回应  16级独孤 | 2019-8-14 01:10:09
建议先先学习 Spring Boot 的相关基础知识,在学些 Spring Cloud 的相关组建的事情,最后结合案例做一次实践。
另外参考一些开源软件也是不错的选择。这里有一个专门搜集 Spring Cloud 学习资源的网站,建议你了解下:
Spring Cloud 中文导航
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:182358
帖子:1746
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP