一、Spring Cloud是什么?
二、为什么要用Spring Cloud?
三、Spring Cloud怎么用?
以上问题相信大家都比我了解的深,透彻,
有独到见解或更详细教学的大佬,欢迎评论留言,加深学习。
四、在这里我记录下搭建简单Spring Cloud项目的步骤以及demo
代码地址:https://github.com/zzpwmf/cloud-zzp/tree/master, 后续慢慢补上spring cloud其他组件
项目整体结构如下:
1.创建一个springboot项目 cloud-zzp 作为父级模块 (创建步骤我就不说了,不懂的自己研究下。)
2.同样的方式创建springboot模块 provider,增加springboot web依赖
添加一个Controller 并提供一个访问入口
@RestController
//@RequestMapping("/test")
public class TestController {
@RequestMapping("/hello")
public String testRest(){
return "hello, welcome to here!";
}
}
修改配置文件application.properties
server.servlet.context-path=/provider
server.port=8080
启动ProviderApplication的main方法,访问http://localhost:8080/provider/hello
3.创建一个springboot项目consumer, 作为消费者
由于Spring Cloud是基于rest的访问,在这我们配置RestTemplate
新建一个类 BeanConfig,
@Configuration
public class BeanConfig {
@Bean
public RestTemplate restTemplate(){
return new RestTemplate();
}
}
新建一个controller,
@RestController
@RequestMapping("/consumerCon")
public class ConsumerController {
@Autowired
private RestTemplate restTemplate;
@RequestMapping("/testConsumer")
public String consumerTest() {
log.info("testConsumer start");
return restTemplate.getForEntity("http://localhost:8080/provider/hello", String.class).getBody();
}
}
修改配置文件,将端口号设置为8081
server.port=8081
server.servlet.context-path=/consumer_zzp
启动消费者模块,访问http://localhost:8081/consumer_zzp/consumerCon/testConsumer
至此,一个简单的项目搭建完成。
4.这里进一步介绍实现Spring Cloud的调用,引入注册中心Eureka
4.1 新建一个SpringBoot项目 eureka-server
4.2 加入spring cloud eureka的依赖
<!-- eureka依赖 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
<!-- springcloud依赖 -->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</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>
4.3 在EurekaServerApplication增加@EnableEurekaServer注解,用于开启 Eureka 注册中心服务端
@EnableEurekaServer
@SpringBootApplication
public class EurekaServerApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaServerApplication.class, args);
}
}
4.4 配置 Eureka 服务注册中心信息:
#内置tomcat端口
server.port=8021
#设置该服务注册中心的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
4.5 启动eureka-server服务,启动成功后访问搭建的注册中心
http://localhost:8021 可以看到注册中心页面
4.6 Eureka注册中心搭建好了之后,我们要怎么利用呢? 向服务注册中心注册服务?
我们之前建了2个模块 provider,consumer
4.7 我们首先来把provider服务注册到eureka注册中心
4.7.1 增加 spring cloud 以及 eureka 依赖
<!--eureka 依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
<!--spring cloud 依赖-->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<!--spring cloud 仓库-->
<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>
4.7.2 在ProviderApplication增加@EnableEurekaClient注解,表明自己是一个 eureka 客户端,让provider服务可以连接 eureka 注册中心;
@SpringBootApplication
@EnableEurekaClient
public class ProviderApplication {
public static void main(String[] args) {
SpringApplication.run(ProviderApplication.class, args);
}
}
4.7.3 修改配置文件,增加eureka配置:
spring.application.name=provider-zzp
eureka.client.service-url.defaultZone=http://localhost:8021/eureka/
4.7.4 启动provider模块,发现eureka-url没有修改成功,读取的是默认配置http://localhost:8761/eureka/
这时我们得增加eureka-starter依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
再次启动,启动成功。访问之前搭建好的注册中心 http://localhost:8021/
可以看到有一个服务 PROVIDER-ZZP 注册成功了
4.8 从 Eureka 服务注册中心发现与消费服务 (将consumer服务注册到注册中心,并调用provider服务)
4.8.1 服务调用这里引入一个概念 Ribbon.
Ribbon 是什么?
Ribbon 是一个基于 HTTP 和 TCP 的客户端负载均衡器,当使用 Ribbon 对服务进行访问的时候,它会扩展 Eureka 客户端的服务发现功能,实现从 Eureka注册中心中获取服务端列表,并通过 Eureka 客户端来确定服务端是否己经启动。
Ribbon 在 Eureka 客户端服务发现的基础上,实现了对服务实例的选择策略,从而实现对服务的负载均衡消费。
我们前面搭建了服务消费者项目(consumer),接下来我们就可以使用该服务消费者通过注册中心去调用服务提供者(provider)
4.8.2 和provider项目一样增加eureka,spring cloud依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<!--仓库-->
<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>
4.8.3 在启动类ConsumerApplication 增加@EnableEurekaClient注解表明自己是一个 eureka 客户端,让服务可以使用 eureka 注册中心
@SpringBootApplication
@EnableEurekaClient
public class ConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(ConsumerApplication.class, args);
}
}
4.8.4 修改配置文件,增加eureka配置
spring.application.name=consumer-zzp
eureka.client.service-url.defaultZone=http://localhost:8021/eureka/
4.8.5 启动ConsumerApplication中的main方法,这里已经加了spring-cloud-starter-eureka依赖,所以启动正常。
4.8.6 再次访问http://localhost:8021/ 发现有2个服务注册进来了
4.8.7 我们的目的是利用注册中心调用服务,而服务的发现由 eureka 客户端实现,而服务的真正调用由 ribbon实现,所以我们需要在调用服务提供者时使用 ribbon 来调用:
在BeanConfig类中 restTemplate声明方法增加 @LoadBalanced
@Configuration
public class BeanConfig {
@LoadBalanced
@Bean
public RestTemplate restTemplate(){
return new RestTemplate();
}
}
加入了 ribbon 的支持,在调用时即可改为使用服务名称来访问
@RequestMapping("/testConsumer")
public String consumerTest() {
log.info("testConsumer start");
return restTemplate.getForEntity("http://provider-zzp/provider/hello", String.class).getBody();
}
4.8.8 重启consumer项目,成功之后访问 http://localhost:8081/consumer_zzp/consumerCon/testConsumer
得到结果:
可以看出consumer调用到了provider服务。
欢迎大神指教,多多评论发表意见!