1.SpringCloud是什么?
SpringCloud是一系列框架的有序集合。【包含了开发所需的其他的框架】。它利用SpringBoot的开发便利性,巧妙地简化了分布式系统基础设施的开发,如服务注册、服务发现、配置中心、消息总线、负载均衡、断路器、数据监控等,这些都可以用SpringBoot的开发风格做到一键启动和部署。
通俗地讲,SpringCloud就是用于构建微服务开发和治理的框架集合(并不是具体的一个框架),主要贡献来自Netflix OSS。
SpringCloud模块介绍
Eureka [juˈriːkə] :服务注册中心,用于服务管理。
Ribbon [ˈrɪbən] :基于客户端的负载均衡组件。
Hystrix:容错框架,能够防止服务的雪崩效应。
Feign [feɪn]:Web服务客户端,能够简化HTTP接口的调用。
Zuul:API 网关,提供路由转发、请求过滤等功能。
Config:分布式配置管理。
Sleuth [sluːθ]:服务跟踪。
Stream:构建消息驱动的微服务应用程序的框架。
Bus:消息代理的集群消息总线。
除了上述模块,还有 Cli、Task等
2. 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。
3.搭建Eureka服务注册中心
springboot版本要和eureka依赖版本匹配,不然报错
2.6.6-----3.1.1 2.5.12------3.0.2
(1)创建一个SpringBoot项目【2.6.6】
(2)pom.xml导入依赖
<!--eureka-server-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
<version>3.1.1</version>
</dependency>
(3)在主类中设置@EnableEurekaServer注解
package com.weiwei.eurekaserver;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
@SpringBootApplication
@EnableEurekaServer
public class EurekaServerApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaServerApplication.class, args);
}
}
(4)配置application.properties文件
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
出现以下页面成功
4.服务提供者
(1)创建一个SpringBoot项目【2.6.6】
(2)导入依赖
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!--eureka-client--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> <version>3.1.1</version> </dependency>
(3)配置application.properties文件
spring.application.name=serviceProvider1 server.port=9090 eureka.client.serviceUrl.defaultZone=http://localhost:8761/eureka/ #采用IP注册 eureka.instance.preferIpAddress=true #定义实例ID格式 eureka.instance.instance-id=${spring.application.name}:${spring.cloud.client.ip-address}:${server.port}
(4)创建接口和实现类和控制类
public interface UserService {
String getName();
}
@Service
public class UserServcieImpl implements UserService{
@Override
public String getName() {
return "你好Eureka";
}
}
@RestController
public class UserController {
@Autowired
private UserService userService;
@RequestMapping("/user.do")
public String getName(){
return userService.getName();
}
}
(5)启动主类
注册中心会多出一个注册者
5.服务消费者
(1)创建一个SpringBoot项目【2.6.6】
(2)导入依赖
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!--eureka-client--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> <version>3.1.1</version> </dependency>
(3)创建RestTemplateConfiguration配置类
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.client.RestTemplate; /** * 通过 RestTemplate 来消费接口 * RestTemplate 是Spring提供的用于访问 Rest 服务的客户端 * RestTemplate 提供了多种便捷访问远程 Http 服务的方法,能够大大提高客户端的编写效率。 */ @Configuration public class RestTemplateConfig { @Bean public RestTemplate getRestTemplate() { return new RestTemplate(); } }
(4)创建消费者的控制器
@RestController public class UserController { @Autowired private RestTemplate restTemplate; @RequestMapping("/show.do") public String shouName(){ return restTemplate.getForObject("http://localhost:9090/user.do",String.class); } }
(5)配置文件
spring.application.name=eurekaconsumer server.port=8082
(6)主类设置@EnableEurekaClient注解
(7)测试服务消费者者
1.启动注册中心服务
2.运行服务提供者主类
3.运行服务消费者者主类
4.浏览器访问:http://localhost:8082/show.do
可以使用服务名称访问服务提供者提供的服务
1.修改RestTemplateConfiguration配置类,加上@LoadBalanced注解
@Configuration public class RestTemplateConfig { @Bean //@LoadBalanced 使用服务名称访问服务提供者提供的服务 @LoadBalanced public RestTemplate getRestTemplate() { return new RestTemplate(); } }
2. 修改服务消费者的控制器,把地址改了
@RestController public class UserController { @Autowired private RestTemplate restTemplate; @RequestMapping("/show.do") public String shouName(){ return restTemplate.getForObject("http://serviceProvider1/user.do",String.class); } }