SpringCloud(三):SpringCloud快速开发入门
3-1. 搭建和配置一个服务提供者
我们知道,SpringCloud 构建微服务是基于 SpringBoot 开发的。(如果SpringBoot不会的可以先看SpringBoot专栏)
1、 创建一个 SpringBoot 工程,并且添加 SpringBoot 的相关依赖;
取名: 01-springcloud-service-provider
2、 创建服务提供者的访问方法,也就是后续消费者如何访问提供者;Spring Cloud 是基于 rest 的访问,所以我们添加一个 Controller,在该
Controller 中提供一个访问入口:

@RequestMapping("/service/hello")
public String hello(){
// 业务逻辑代码省略
return "Hello,Spring Cloud";
}
3、 启动运行该 SpringBoot 程序,访问该 controller;访问结果如下:

3-2. 搭建和配置一个服务消费者
服务消费者也是一个 SpringBoot 项目,服务消费者主要用来消费服务提供者提供的服务;
1、 创建一个 SpringBoot 工程,并且添加 SpringBoot 的相关依赖;
项目名:02-springcloud-service-consumer
这里要建模块,才能在同一个工作区 方便后面操作 具体看图

中间省略

2、开发一个消费者方法,去消费服务提供者提供的服务,这个消费者方法也是一个 Controller: 如图:
先建一个包 config ,建一个类:BeanConfig

@Configuration // 等价于一个Spring applicationContext.xml配置文件
public class BeanConfig {
/**
* @Bean 等价于:
* <bean id="restTemplate" class="xxx.xxx.RestTemplate"></bean>
* @return
*/
@Bean
public RestTemplate restTemplate(){
return new RestTemplate();
}
}
在建controller层(里面调用的项目一的controller)

@RestController
public class WebController {
@Autowired
private RestTemplate restTemplate; @RequestMapping("/web/hello")
public String hello(){
// 逻辑代码(省略) // 调用SpringCloud服务提供者提供的服务
return restTemplate.getForEntity("http://localhost:8080/service/hello",String.class).getBody();
}
}
把02-springcloud-service-consumer 端口改成8081,

启动第一个项目01-springcloud-service-provider 端口8080 ,在启动第二个项目 02-springcloud-service-consumer 端口8081,访问第二个项目的controller
地址即:http://localhost:8081/web/hello
访问结果如图:

进一步完善,实现真正的SpringCloud调用!
3-3. 走进服务注册中心 Eureka
在微服务架构中,服务注册与发现是核心组件之一,手动指定每个服务是很低效的,Spring Cloud 提供了多种服务注册与发现的实现方式,例如:Eureka、Consul、Zookeeper。
Spring Cloud 支持得最好的是 Eureka,其次是 Consul,再次是 Zookeeper。
什么是服务注册?
服务注册:将服务所在主机、端口、版本号、通信协议等信息登记到注册中心上;
什么是服务发现?
服务发现:服务消费者向注册中心请求已经登记的服务列表,然后得到某个服务的主机、端口、版本号、通信协议等信息,从而实现对具体服务的调用;
Eureka 是什么?
Eureka 是一个服务治理组件,它主要包括服务注册和服务发现,主要用来搭建服务注册中心。
Eureka 是一个基于 REST 的服务,用来定位服务,进行中间层服务器的负载均衡和故障转移;
Eureka 是 Netflix 公司开发的,Spring Cloud 封装了 Netflix 公司开发的
Eureka 模块来实现服务注册和发现,也就是说 Spring Cloud 对 Netflix Eureka做了二次封装;
Eureka 采用了 C-S(客户端/服务端)的设计架构,也就是 Eureka 由两个组件组成:Eureka 服务端和 Eureka 客户端。Eureka Server 作为服务注册的服务
端,它是服务注册中心,而系统中的其他微服务,使用 Eureka 的客户端连接到 Eureka Server 服务端,并维持心跳连接,Eureka 客户端是一个 Java 客户端,用来简化与服务器的交互、负载均衡,服务的故障切换等;有了 Eureka 注册中心,系统的维护人员就可以通过 Eureka Server 来监控系统中各个微服务是否正常运行。
3-4. Eureka 与 Zookeeper 的比较
著名的 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 在网络故障导致部分节点失去联系的情况下,只要有一个节点可用,那么注册和查询服务就可以正常使用,而不会像 zookeeper 那样使整个注册服务瘫痪,Eureka 优先保证了可用性。
3-5. 搭建与配置 Eureka 服务注册中心
Spring Cloud 要使用 Eureka 注册中心非常简单和方便,Spring Cloud 中的Eureka 服务注册中心实际上也是一个 Spring Boot 工程,我们只需通过引入相
关依赖和注解配置就能让 Spring Boot 构建的微服务应用轻松地与 Eureka 进行整合。具体步骤如下:
1、 创建一个 SpringBoot 项目,并且添加 SpringBoot 的相关依赖;03-springcloud-eureka-server 也是new一个模块 步骤和创建项目2的一样
2、 添加 eureka 的依赖:
<!--Spring Cloud的eureka-server起步依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>

再添加springcloud依赖
<!--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>

再添加SpringCloud仓库
<!--仓库-->
<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>
3、 在 Spring Boot 的入口类上添加一个@EnableEurekaServer 注解,用于开启 Eureka 注册中心服务端

在 application.properties 文件中配置 Eureka 服务注册中心信息:
#内嵌定时tomcat的端口
server.port=8761
#设置该服务注册中心的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

3-6. 启动与测试 Eureka 服务注册中心
1、完成上面的项目搭建后,我们就可以启动 SpringBoot 程序,main 方法运行;
2、启动成功之后,通过在浏览器地址栏访问我们的注册中心;

3-7. 向 Eureka 服务注册中心注册服务
我们前面搭建了服务提供者项目(即项目01-springcloud-service-provider),接下来我们就可以将该服务提供者注册到Eureke 注册中心,步骤如下:
1、在该服务提供者中添加 eureka 的依赖,因为服务提供者向注册中心注册服务,需要连接 eureka,所以需要 eureka 客户端的支持;
<!--SpringCloud集成eureka客户端的起步依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
springboot项目中没有eureka客户端的依赖,所以我们需要加入SpringCloud依赖 和SpringCloud仓库 步骤和项目3一样
<!--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>
<!--springcloud仓库-->
<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>
2、激活 Eureka 中的 EnableEurekaClient 功能:
在 Spring Boot 的入口函数处,通过添加@EnableEurekaClient 注解来表明自己是一个 eureka 客户端,让我的服务提供者可以连接 eureka 注册中心;

3、配置服务名称和注册中心地址
#配置服务的名称
spring.application.name=01-springcloud-service-provider
#eureka的连接地址
eureka.client.service-url.defaultZone=http://localhost:8761/eureka

4、启动服务提供者 SpringBoot 程序的 main 方法运行;
5、启动运行之后,通过在浏览器地址栏访问我们之前搭建好的 eureka 注册中心,就可以看到有一个服务已经注册成功了;

3-8. 从 Eureka 服务注册中心发现与消费服务
我们已经搭建一个服务注册中心,同时也向这个服务注册中心注册了服务,接下来我们就可以发现和消费服务了,这其中服务的发现由 eureka 客户端实现,而
服务的消费由 Ribbon 实现,也就是说服务的调用需要 eureka 客户端和 Ribbon两者配合起来才能实现;
Eureka 客户端是什么?
Eureka 客户端是一个 Java 客户端,用来连接 Eureka 服务端,与服务端进行交互、负载均衡,服务的故障切换等;
Ribbon 是什么?
Ribbon 是一个基于 HTTP 和 TCP 的客户端负载均衡器,当使用 Ribbon 对服务进行访问的时候,它会扩展 Eureka 客户端的服务发现功能,实现从 Eureka
注册中心中获取服务端列表,并通过 Eureka 客户端来确定服务端是否己经启动。
Ribbon 在 Eureka 客户端服务发现的基础上,实现了对服务实例的选择策略,从而实现对服务的负载均衡消费。
接下来我们来让服务消费者去消费服务:我们前面搭建了服务消费者项目,接下来我们就可以使用该服务消费者通过注册
中心去调用服务提供者,步骤如下:
1、在该消费者项目中添加 eureka 的依赖,因为服务消费者从注册中心获取服务,需要连接 eureka,所以需要 eureka 客户端的支持;
<!--eureka 的依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
同时也要加入 springcloud依赖和springcloud仓库
<!--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>
<!--springcloud仓库-->
<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>
2、激活 Eureka 中的 EnableEurekaClient 功能:
在 Spring Boot 的入口函数处,通过添加@EnableEurekaClient 注解来表明自己是一个 eureka 客户端,让我的服务消费者可以使用 eureka 注册中心;

3、配置服务的名称和注册中心的地址:
server.port=8081
#配置服务的名称
spring.application.name=02-springcloud-service-consumer
#配置eureka注册中心地址
eureka.client.service-url.defaultZone=http://localhost:8761/eureka

4、前面我介绍了服务的发现由 eureka 客户端实现,而服务的真正调用由 ribbon实现,所以我们需要在调用服务提供者时使用 ribbon 来调用:

加入了 ribbon 的支持,那么在调用时,即可改为使用服务名称来访问:
return restTemplate.getForEntity("http://01-springcloud-service-provider/service/hello",String.class).getBody();

5、完成上面的步骤后,我们就可以启动消费者的 SpringBoot 程序(即项目2),main 方法运行;
6、启动成功之后,通过在浏览器地址栏访问我们的消费者,看是否可以正常调用远程服务提供者提供的服务;

SpringCloud(三):SpringCloud快速开发入门的更多相关文章
- Scala 基础(三):Scala语言快速开发入门
1.Scala执行流程分析 2.Scala程序开发注意事项(重点) Scala源文件以 “.scala" 为扩展名. Scala程序的执行入口是main()函数. Scala语言严格区分大小 ...
- UWP简单示例(三):快速开发2D游戏引擎
准备 IDE:VisualStudio 2015 Language:VB.NET/C# 图形API:Win2D MSDN教程:UWP游戏开发 游戏开发涉及哪些技术? 游戏开发是一门复杂的艺术,编码方面 ...
- STM32F767ZI NUCLEO144 基于CubeIDE快速开发入门指南
刚入手的NUCLEO-F767ZI:整合官网资源,理清思路,便于快速进行快发: 文章目录 1 NUCLEO 系列 2 NUCLEO-F767ZI 3 环境搭建 3.1 Keil/IAR安装 3.2 C ...
- Go 语言快速开发入门
目录 需求 开发的步骤 linux下如何开发Go程序 MAC下如何开发Go程序 Golang执行流程分析 编译和运行说明 Go程序开发的注意事项 Go语言的转义字符(escapechar) Golan ...
- SpringCloud(2)---SpringCloud入门篇
SpringCloud理解篇 一.微服务概述 1.什么是微服务 目前的微服务并没有一个统一的标准,一般是以业务来划分将传统的一站式应用,拆分成一个个的服务,彻底去耦合,一个微服务就是单功能业务,只做一 ...
- SpringCloud微服务治理技术入门(SCN)
1.集群.分布式.微服务 首先先理解三个感念 什么是集群?: 同一个业务,部署在多个服务器上,目的是实现高可用,保证节点可用! 什么是分布式?: 一个业务分拆成多个子业务,部署在不同的服务器上,每个子 ...
- [译]:Xamarin.Android开发入门——Hello,Android快速上手
返回索引目录 原文链接:Hello, Android_Quickstart. 译文链接:Xamarin.Android开发入门--Hello,Android快速上手 本部分介绍利用Xamarin开发A ...
- OWIN的理解和实践(三) –Middleware开发入门
上篇我们谈了Host和Server的建立,但Host和Server无法产出任何有实际意义的内容,真正的内容来自于加载于Server的Middleware,本篇我们就着重介绍下Middleware的开发 ...
- 使用 CodeIgniter 框架快速开发 PHP 应用(三)
原文:使用 CodeIgniter 框架快速开发 PHP 应用(三) 分析网站结构既然我们已经安装 CI ,我们开始了解它如何工作.读者已经知道 CI 实现了MVC式样. 通过对目录和文件的内容进行分 ...
随机推荐
- CF-1440C2 Binary Table (Hard Version) (构造,模拟)
Binary Table (Hard Version) 题意 \(n*m(2\le n,m\le 100)\) 的01矩阵,每次可以选择一个宽度为2的子矩阵,将四个位置中的任意3个进行翻转,即0变1, ...
- 【noi 2.6_6045】开餐馆(DP)
题意:有N个地址,从中选一些开餐馆,要保证相邻餐馆的距离大于k.问最大利润. 解法:f[i]表示在前 i 个地址中选的最大利润. 1 #include<cstdio> 2 #include ...
- A. Little Pony and Expected Maximum
Twilight Sparkle was playing Ludo with her friends Rainbow Dash, Apple Jack and Flutter Shy. But she ...
- Codeforces Round #648 (Div. 2) E. Maximum Subsequence Value 贪心
题意:E.Maximum Subsequence Value 题意: 给你n 个元素,你挑选k个元素,那么这个 k 集合的值为 ∑2i,其中,若集合内至少有 max(1,k−2)个数二进制下第 i 位 ...
- 📚C#/.NET/.NET Core推荐学习书籍(升职加薪,你值得拥有)
前言: 作为一名程序员,我们无时无刻都要考虑着如何通过不断地学习来提升自己的核心竞争力.古人有云:"书中自有黄金屋,书中只有颜如玉",说明了书籍的重要性,没错工作多年来,发现身边那 ...
- 网络协议 & 协议体系结构模型
基本知识概述 网络协议是什么? 为进行网络中的数据交换,而建立的规则(约定),就称为网络协议 网络协议的三个组成要素? 语法:数据与控制信息的结构或格式 语义:发出何种控制信息,完成何种动作,作出何种 ...
- IFIX 5.9 报警存sql
环境 win7x64 + ifix 5.9 + sql server 2008 (sql 我装在了别的win10的机器上,和ifix的win7不在同一个机器,网是通的) 1 安装sql server ...
- Leetcode(94)-二叉树的中序遍历
给定一个二叉树,返回它的中序 遍历. 示例: 输入: [1,null,2,3] 1 \ 2 / 3 输出: [1,3,2] 思路:和上篇的前序遍历一样,同样有递归和非递归的做法 (1)递归 vecto ...
- 前端接收后端文件流导出excel文档遇到的问题
先上代码: Vue.prototype.download = function(oUrl, filename) { this.axios .get(oUrl, { responseType: 'arr ...
- HDU2837 Calculation(指数循环节)题解
题意: 已知\(f(0)=1,f(n)=(n\%10)^{f(n/10)}\),求\(f(n)\mod m\) 思路: 由扩展欧拉定理可知:当\(b>=m\)时,\(a^b\equiv a^{b ...