SpringBoot学习系列(十九)------SpringBoot和SpringCloud
前言
SpringCloud是Spring全家桶中的一员,它是一个分布式的整体解决方案。Spring Cloud 为开发者提供了在分布式系统(配
置管理,服务发现,熔断,路由,微代理,控制总线,一次性token,全局琐,leader选举,分布式session,集群状态)中快速构建的工具,使用Spring Cloud的开发者可以快速的启动服务或构建应用、同时能够快速和云平台资源进行对接。因此,掌握SpringCloud栈,对于我们个人的技能提升也是很有帮助的,下面我们一起来学习SpringCloud的简单实用吧!
正文
1. SpringCloud五大组件
- 服务发现:Netflix Eureka(相当于Zookeeper)
- 负载均衡:Netflix Ribbon
- 断路器:Netflix Hystrix
- 服务网关:Netflix Zuul
- 分布式配置:Spring Cloud Config
SpringCloud通过这五大组件,极大的方便了我们的项目开发,且在服务调用之间,实用轻量级的Http协议来调用,通俗易懂,下面我们就来使用一下.
2. 使用SpringCloud
首先我们来创建三个工程:
- springboot-eureka:作为注册中心,其他两个工程都向该工程注册自己的服务
- consumer-user:服务消费者,需要调用生产者发布的服务
- provider-order:服务生产方,向外界暴露服务,并且将服务注册在eureka中
我们使用IDEA快速创建三个项目,需要注意的是,注册中心和其他两个工程引入的模块是不一样的:
springboot-eureka引入Eureka Server模块
其他两个工程引入
创建完成后,工程目录如下:
3. 配置注册中心eureka
我们先配置好eureka注册中心,在springboot-eureka
下创建一个yml配置文件,在配置文件中配置如下内容:
server:
port: 8080
eureka:
instance:
hostname: springboot-eureka # eureka实例的主机名
client:
register-with-eureka: false #不把自己注册到eureka上
fetch-registry: false #不从eureka上来获取服务的注册信息
service-url:
defaultZone: http://localhost:8080/eureka/ #指定注册中心的地址
注意,如果在项目中发现不能使用eukare的注解和对应的配置属性,排除依赖引入的错误以后,要看一下版本是否正确,也就是pom文件中的版本,如下:
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<!--如果版本导入错误,会出现找不到eureka注解的情况-->
<version>Finchley.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
其次在启动类中添加注解@EnableEurekaServer
表示开启注册服务
@EnableEurekaServer//开启eukare注册服务
@SpringBootApplication
public class SpringbootEurekaApplication {
public static void main(String[] args) {
SpringApplication.run(SpringbootEurekaApplication.class, args);
}
}
启动该项目,浏览器访问http://localhost:8080/
,可以看到eureka的web页面:
以后我们注册的服务会在application这个模块显示出来.
4. 编写服务提供者和服务消费者
-
配置并编写provider-order
首先在配置文件中配置对应的信息:
server: port: 8082 spring: application: name: provider-order #指定发布服务的服务名 eureka: instance: prefer-ip-address: true # 注册服务的时候使用服务的ip地址 client: service-url: defaultZone: http://localhost:8080/eureka/ #配置注册中心的地址
编写一个服务类:
@Service public class OrderService { public String queryOrder() { return "查询到了订单!"; } }
编写对应的controller(因为SpringCloudEureka基于轻量的http协议,因此只需要编写controller即可)
@RestController public class OrderController { @Autowired private OrderService orderService; @GetMapping("/order") public String queryOrder() { return orderService.queryOrder(); } }
启动该工程,我们可以在eureka的控制页面看到服务已经注册到了注册中心:
-
编写consumer-user工程
先来配置一下:
spring: application: name: consumer-user server: port: 8083 eureka: instance: prefer-ip-address: true # 注册服务的时候使用服务的ip地址 client: service-url: defaultZone: http://localhost:8080/eureka/
接下来我们需要在启动类中开启服务发现且给容器中注入一个
RestTemplate
来调用服务.RestTemplate
是SpringBoot为我们提供的简洁的http调用客户端,我们可以使用它很方便的调用我们发布的服务:@EnableDiscoveryClient//开启服务发现 @SpringBootApplication public class ConsumerUserApplication { public static void main(String[] args) { SpringApplication.run(ConsumerUserApplication.class, args); } @LoadBalanced//开启负载均衡,如果有多个相同服务的实例,会轮询调用,实现负载均衡 @Bean public RestTemplate restTemplate() { return new RestTemplate(); } }
我们在controller层编写对应的方法:
@RestController public class UserController { /** * restTemplate可以发送http请求 */ @Autowired private RestTemplate restTemplate; @GetMapping("/user") public String queryOrder() { System.out.println("开始调用服务!"); //getForObjec方法中,第一个参数代表要调用的服务的地址,格式为:http://服务名/对应服务的url //第二个参数为该服务返回的数据类型,在这里是String类型. String str = restTemplate.getForObject("http://PROVIDER-ORDER/order", String.class); return str; } }
启动该项目,我们可以在eureka的web页面看到已经注册上去了.
-
启动项目,测试服务调用
编写完所有的东西以后,我们启动三个项目,注意在本机上启动时端口号不能一直.下面是调用结果:
可以看到服务调用成功
总结
SpringCloud的简单实用就说到这里,在这里,我们实现类简单的分布式服务间的调用,可以看到,SpringCloud服务的调用方式还是很简单的,我们只需要简单的配置好注册中心的地址,就可以很方便的进行服务的对外发布.