1.Spring Cloud是什么?
SpringCloud是一系列框架的有序集合。【包含了开发所需的其他的框架】
它利用SpringBoot的开发便利性,巧妙地简化了分布式系统基础设施的开发,如服务注册、服务发现、配置中心、消息总线、负载均衡、断路器、数据监控等,这些都可以用SpringBoot的开发风格做到一键启动和部署。
通俗地讲,SpringCloud就是用于构建微服务开发和治理的框架集合(并不是具体的一个框架),主要贡献来自Netflix OSS。
微服务--搭积木
提供不同形状的积木块【服务】
通过不同形状的积木块相互配合建造出来的城堡 【项目】
2.SpringCloud模块介绍
Eureka [juˈriːkə] :服务注册中心,用于服务管理。
Ribbon [ˈrɪbən] :基于客户端的负载均衡组件。
Hystrix:容错框架,能够防止服务的雪崩效应。
Feign [feɪn]:Web服务客户端,能够简化HTTP接口的调用。
Zuul:API 网关,提供路由转发、请求过滤等功能。
Config:分布式配置管理。
Sleuth [sluːθ]:服务跟踪。
Stream:构建消息驱动的微服务应用程序的框架。
Bus:消息代理的集群消息总线。
除了上述模块,还有 Cli、Task等。教程中只介绍一些常用的模块。
3.SpringCloud版本介绍
在第一次访问 Spring Cloud 官网时一定会有一个疑惑那就是版本太多了,到底哪个是稳定版本?哪个才是自己需要的版本?接下来就给大家简单介绍一下版本的问题。
参考图:
从图中可以看到 Spring Cloud 不是像别的项目那样,版本号采用 1.1、1.2、1.3 这种的格式 因为 SpringCloud 是一个拥有诸多子项目的大型综合项目,可以说是对微服务架构解决方的综合套件组件,其中包含的各个子项目都独立进行着内容的迭代与更新,各自维护着自己的发布版本号
建议:至于怎么选择适合自己的版本,大家可以在接触的时候直接选最新的稳定版本。新版本中的 Bug 肯定要少,并且更稳定。
4.SpringCloudEureka是什么?
SpringCloudEureka是SpringCloudNetflix微服务套件的一部分,基于Netflix Eureka做了二次封装,主要负责实现微服务架构中的服务治理功能。
SpringCloudEureka是一个基于REST的服务,并且提供了基于Java的客户端组件,能够非常方便地将服务注册到SpringCloudEureka中进行统一管理。
服务治理是微服务架构中必不可少的一部分,阿里开源的 Dubbo 框架就是针对服务治理的。服务治理必须要有一个注册中心,除了用Eureka作为注册中心外,我们还可以使用 Consul、Etcd、Zookeeper等来作为服务的注册中心。
用过Dubbo的读者应该清楚,Dubbo中也有几种注册中心,比如基于Zookeeper、基于Redis等,不过用得最多的还是Zookeeper方式。
为什么 Eureka 比 Zookeeper 更适合作为注册中心呢?主要是因为 Eureka 是基于 AP 原则构建的,而 ZooKeeper 是基于 CP 原则构建的。
在分布式系统领域有个著名的 CAP 定理,即 C 为数据一致性;A 为服务可用性;P 为服务对网络分区故障的容错性。这三个特性在任何分布式系统中都不能同时满足,最多同时满足两个。
Zookeeper 有一个 Leader,而且在这个 Leader 无法使用的时候通过 Paxos(ZAB)算法选举出一个新的 Leader。这个 Leader 的任务就是保证写数据的时候只向这个 Leader 写入,Leader 会同步信息到其他节点。通过这个操作就可以保证数据的一致性。
总而言之,想要保证 AP 就要用 Eureka,想要保证 CP 就要用 Zookeeper。
Dubbo 中大部分都是基于 Zookeeper 作为注册中心的。Spring Cloud 中当然首选 Eureka。
搭建Eureka服务注册中心
1.创建一个SpringBoot项目【2.5.12】
2.导入依赖【1.SpringCloud依赖 2.Eureka服务依赖】
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>2021.0.2-SNAPSHOT</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<!--eureka-server-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
<version>3.0.2</version>
</dependency>
3.在主类中设置@EnableEurekaServer
@SpringBootApplication
//表示开启EurekaServer[注册中心]
@EnableEurekaServer
public class SpringcloudServerApplication {
public static void main(String[] args) {
SpringApplication.run(SpringcloudServerApplication.class, args);
}
}
4.配置配置文件
spring.application.name=eurekaserver
server.port=8761
#由于该应用为注册中心, 所以设置为false, 代表不向注册中心注册自己
eureka.client.register-with-eureka=false
#由于注册中心的职责就是维护服务实例, 它并不需要去检索服务, 所以也设置为 false
#eureka.client.register-with-eureka一定要配置为false,不然启动时会把自己当作客户端向自己注册,会报错。
eureka.client.fetch-registry=false
5.启动注册中心服务,测试http://localhost:8761/,出现以下页面显示Eureka注册中心搭建成功
使用Eureka编写服务提供者
1.创建一个SpringBoot项目【2.5.12】
2.导入依赖【1.SpringCloud依赖 2.Eureka服务依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--eureka-server-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
<version>3.0.2</version>
</dependency>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>2021.0.2-SNAPSHOT</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
3.创建服务接口和实现类
public interface UserName {
/**
* 得到用户姓名
* @return
*/
String getUsername();
}
@Service("userService")
public class UserService implements UserName {
@Override
public String getUsername() {
return "宁红叶";
}
}
4.创建提供者的控制器
@RestController
public class UserController {
@Autowired
private UserName userName;
@RequestMapping("username")
public String getUserName(){
return userName.getUsername();
}
}
5.配置文件
spring.application.name=eurekaprovderdemo
server.port=8081
eureka.client.serviceUrl.defaultZone=http://localhost:8761/eureka/
#采用IP注册
eureka.instance.preferIpAddress=true
#定义实例ID格式
eureka.instance.instance-id=${spring.cloud.client.ip-address}:${spring.application.name}:${server.port}
6.主类设置@EnableEurekaClient注解
@SpringBootApplication
@EnableEurekaClient
public class SpringcloudProvideApplication {
public static void main(String[] args) {
SpringApplication.run(SpringcloudProvideApplication.class, args);
}
}
7.测试服务提者
1.启动注册中心服务
2.运行服务提供者主类
3.浏览器中测试:http://localhost:8761/ 可以看见注册好的服务
使用Eureka编写服务消费者
1.创建一个SpringBoot项目【2.5.12】
2.导入依赖【1.SpringCloud依赖 2.Eureka服务依赖】
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--eureka-server-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
<version>3.0.2</version>
</dependency>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>2021.0.2-SNAPSHOT</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
3.创建RestTemplateConfiguration配置类
通过 RestTemplate 来消费接口
RestTemplate 是 Spring 提供的用于访问 Rest 服务的客户端,RestTemplate 提供了多种便捷访问远程 Http 服务的方法,能够大大提高客户端的编写效率。
@Configuration
public class RestTemplateConfiguration {
@Bean
public RestTemplate getRestTmplate(){
return new RestTemplate();
}
}
4.创建消费者的控制器,将创建好的RestTemplate注入进控制器
@RestController
public class UserBeanController {
@Autowired
private RestTemplate restTemplate;
@RequestMapping("/showName")
public String getUserName(){
System.out.println("123");
return restTemplate.getForObject("http://localhost:8081/username", String.class);
}
}
5.配置文件
spring.application.name=eurekacomsumerdemo1
server.port=8082
6.主类设置@EnableEurekaClient注解
@SpringBootApplication
@EnableEurekaClient
public class SpringcloudConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(SpringcloudConsumerApplication.class, args);
}
}
7.测试服务消费者者
1.启动注册中心服务
2.运行服务提供者主类
3.运行服务消费者者主类4.浏览器访问:http://localhost:8082/showName