一、Spring Cloud简介
Spring Cloud是一个分布式的整体解决方案。Spring Cloud 为开发者提供了在分布式系统
(配置管理,服务发现,熔断,路由,微代理,控制总线,一次性token,全局琐,leader选举,
分布式session,集群状态)中快速构建的工具,使用Spring Cloud的开发者可以快速的启
动服务或构建应用、同时能够快速和云平台资源进行对接。
SpringCloud分布式开发五大常用组件
服务发现——Netflix Eureka
客服端负载均衡——Netflix Ribbon
断路器——Netflix Hystrix
服务网关——Netflix Zuul
分布式配置——Spring Cloud Config
二、测试springcloud
一、创建3个项目分别作为注册中心,服务提供者,服务消费者
我这为了方便测试,只是创建了一个空的项目,然后再分别创建3个模块
1、新建空项目
2、分别创建三个模块
创建注册中心模块
使用spring的初始化向导
由于要做注册中心,所以我们选择Eureka Server模块
接下下来再创建服务提供者和服务消费者模块
创建模块步骤都是一样,唯独服务提供者和服务消费者创建时选择的模块是Eureka Discovery Client,而不是Eureka Server,另外加一个Web模块
创建后的三个模块
二、在注册中心(eureka-server模块)中配置eureka信息
1、我这里用的是application.yml进行配置的
server:
port: 8761
eureka:
instance:
hostname: eureka-server #eureka实例主机名
client:
register-with-eureka: false #不把自己注册到eureka
fetch-registry: false #不从eureka上来获取服务的注册信息
service-url:
defaultZone: http://localhost:8761/eureka/ #自己指定注册中心服务的地址
注册中心默认的服务地址
2、在启动器类中加@EnableEurekaServer注解启动Eureka注册中心的功能
/** * 注册中心 * 1、配置Euraka信息 * 2、@EnableEurekaServer */ @EnableEurekaServer @SpringBootApplication public class EurekaServerApplication { public static void main(String[] args) { SpringApplication.run(EurekaServerApplication.class, args); } }
三、启动注册中心(eureka-server模块)服务查看效果
启动服务之后控制台有打印
说明注册中心配置成功
三、服务提供者(provide-ticket模块)提供服务
1、创建service和controller
TicketService代码
import org.springframework.stereotype.Service; @Service public class TicketService { public String getTicket(){ return "《我和我的祖国》"; } }
TicketController代码
@RestController public class TicketController { @Autowired TicketService ticketService; @GetMapping("/ticket") public String getTicket(){ return ticketService.getTicket(); } }
2、在application.yml中配置注册信息
server: port: 8001 spring: application: name: provide-ticket eureka: instance: prefer-ip-address: true #注册的时候使用服务的ip地址 client: service-url: defaultZone: http://localhost:8761/eureka/ #指定注册中心服务的地址
服务的地址要和我们创建的注册中心的地址想对应
3、启动项目,项目服务将会注册到注册中心里
注意:我们的注册中心必须是一直启动着,这样才能注册进去
启动着注册中心(eureka-server模块),然后启动服务提供者(provide-ticket模块)后;
可以在注册中心页面中看到我们注册成功的服务
四、服务消费者(consumer-user模块)调用服务
1、consumer-user的application.yml中进行相关配置
spring:
application:
name: consumer-user
server:
port: 8200
eureka:
instance:
prefer-ip-address: true #注册的时候使用服务的ip地址
client:
service-url:
defaultZone: http://localhost:8761/eureka/ #指定注册中心服务的地址
2、在启动器类中把RestTemplate注入容器并开启发现服务的注解
@EnableDiscoveryClient //开启发现服务功能 @SpringBootApplication public class ConsumerUserApplication { public static void main(String[] args) { SpringApplication.run(ConsumerUserApplication.class, args); } @LoadBalanced //使用负载均衡机制 @Bean public RestTemplate restTemplate(){ return new RestTemplate(); } }
通过RestTemplate进行访问远程服务
@LoadBalanced:使用负载均衡机制稍后再说明
3、编写一个controller进行调用远程服务
@RestController public class UserController { @Autowired RestTemplate restTemplate; @GetMapping("/buy") public String buyTicket(String name){ String s = restTemplate.getForObject("http://PROVIDE-TICKET/ticket", String.class); return name+"购买了"+s; } }
restTemplate.getForObject("http://PROVIDE-TICKET/ticket", String.class)
第一个参数是http://服务名/服务地址
服务地址(服务模块里的controller):
第二个参数:返回值类型
4、测试
注意注册中心服务和服务提供者需要是开启状态才能调用成功
启动服务,链接访问
远程调用服务成功
五、说明之前的负载均衡机制@LoadBalanced
即注册中心有两个或多个相同的服务时,比如这里有两个PROVIDER-TICKET服务注册了;启动了负载均衡机制时,那么服务消费者远程调用这个PROVIDER-TICKET服务时,
是轮回着调用的;以达到负载均衡。