首先让我们先明白springboot&spring&springCloud的关系
- springboot&spring:SpringBoot底层就是Spring,简化使用Spring的方式而已,多加了好多的自动配置;简单来说就是简化了配置,让开发上手更加容易简单
- Spring Cloud&SpringBoot:Spring Cloud是分布式系统的整体解决方案,底层用的SpringBoot来构建项目,Cloud新增很多的分布式的starter,包括这些starter的自动配置;
如图所示,首先用户中心和电影服务都得注册在注册中心,用户中心的某个服务想要远程调用电影服务时:
- 先想注册中心获取到电影服务所在的地址
-
通过
restTemplate/Feign
的方式来调用来远程调用 -
在通过
Ribbon
来负载均衡;默认的方式是采用的是轮询方式且restTemplate和Feign都是默认带Ribbon,所以要实现Ribbon可以可以增加Ribbon的Starter也可以不增加,由于本次是快速搭建就不增加了,同时也是使用的是默认的轮询的方式
梳理完之后,咱就开始搭建;
首先肯定是要先把注册中心给搭建出来
-
创建一个springboot项目,引入
eureka-server
和web的start - 编写application.yml,进行些许配置就能快速搭建
spring:
application:
name: cloud-eureka-registry-center
server:
port: 8761
eureka:
instance:
hostname: localhost
client:
register-with-eureka: false #自己就是注册中心,不用注册自己
fetch-registry: false #要不要去注册中心获取其他服务的地址
service-url:
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
- 因为快速搭建,就没有配置__region__和__Zone__,只是配置了eureka.client.service-url.defaultZone;
这里简单解释一下Region和Zone
- Region和Zone就相当于大区和机房,一个Region(大区)可以有很多的Zone(机房)。在Spring Cloud中,服务消费者会优先查找在同一个Zone的服务,之后在去查找其他的服务。如果该项配置使用的好,那么项目请求的响应时间将大大缩短!
现在配置文件和项目都搭建后了最后一步就是在这个模块的主程序加入@EnableEurekaServer注解;开启Eureka注册中心功能,
然后 Boot Dashboard视图启动注册中心,访问http://localhost:8761,就可以看到:
- 看到这个就代表配置成功;可以看到在application里是没有服务注册的,所以现在还是个空的中心
注册中心搭建完后,就该搭建服务了,且要注册到注册中心中去
- 先搭建电影服务吧
- 同样创建springboot项目,name:cloud-provider-movie
-
引入
eureka-Discovery
、web模块
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
- 然后想正常开发web一样创建bean/service/controller/dao;dao采用模拟假的数据,就不配置数据源了
-
在主程序添加@EnableEurekaClient注解
- 先启动 调用controller中的方法 可以成功
- 但是在注册中心并没有看到我们的这个服务
- 现在我们就得编写配置文件application.yml
spring:
application:
name: cloud-provider-movie
server:
port: 8000
# 指定注册到哪个注册中心
eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka/
instance:
prefer-ip-address: true #注册自己服务使用ip的方式
-
通过配置可以指定注册到哪个注册中心;现在再打开注册中心
- 可以看到已经出现了我们创建的这个项目
与搭建电影服务一样,我们也搭建了用户中心,现在用户中心服务和电影服务都在注册中心注册了
现在的问题就是如果用户中心想远程调用电影服务怎么办,可以通过两种
先来实现restTemplate的方式
- 如图看到用户中心的一个controller,如果要通过远程调用来获取Movie对象的话,通过restTemplate方式对象来调用相对于的方法返回;
-
怎么来获得这个RestTemplate
– 可以通过主程序中生成RestTemplate添加
@bean
交给spring管理和添加
@LoadBalanced
就可以加入负载均衡的功能,默认方式是轮询
–
– 这样我们在controller就可以注入这个RestTemplate对象来调用相对于的功能 - 现在我们就成功调用了电影服务的方法返回了Movie对象
接下来我们就来采用Feign方式来调用远程方法(主要)
- 先来看怎么调用的
-
先是注入了一个
Feign接口对象
这里面声明的是远程电影服务的方法 - 然后通过这个接口对象调用方法就完事了,看起来是不是比restTemplate优雅很多
现在我们就来看看要用Feign方式要做什么工作
-
要引入eureka-Discovery、web、
Feign
模块 -
在主程序添加==@EnableFeignClients(开启Feign功能)
和
@EnableDiscoveryClient == 不用添加==@EnableEurekaClient==注解了 -
接下来就是最重要的接口,定义
Feign接口
- 可以看到,接口得加入==@FeignClient注解==指定调用哪一个服务,服务的名称必须和远程服务名称一致
- 然后:/Feign接口方法声明 与 远程服务声明接口 保持一致,就OK了
-
然后就是在
controller中
注入这个对象,通过这个对象调用远程的方法 - 测试同样是可以正常访问,没有问题
总结
- 可以看出Feign的使用是比RestTemplate的方式优雅
- Feign是面向接口编程,RestTemplate面向一个测试类的测试方式)
- Feign和RestTemplate都内置了Ribbon
版权声明:本文为qq_42296117原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。