SpringBoot与分布式
SpringBoot、Dubbo、zookeeper整合
1、准备两个项目,一个服务提供者,一个消费者
2、将服务提供者注册到注册中心
(1) 引入dubbo的starter
(2) 引入zookeeper的客户端工具
(3) 在application.yml中配置dubbo相关属性
(4) 在要发布的类上标注上dubbo的@Service注解并将类加入到容器
3、消费者使用服务者提供的功能(引用注册中心的服务)
(1) 引入dubbo的starter
(2) 引入zookeeper的客户端工具
(3) 在application.yml中配置dubbo相关属性
(4) 远程调用发布到注册中心的类
引入dubbo的starter
<dependency> <groupId>com.alibaba.boot</groupId> <artifactId>dubbo-spring-boot-starter</artifactId> <version>0.1.0</version> </dependency>
引入zookeeper的客户端工具zkclient
<dependency> <groupId>com.101tec</groupId> <artifactId>zkclient</artifactId> <version>0.10</version> </dependency>
在application.yml中配置dubbo相关属性
dubbo: application: name: provider-ticket # 项目的名字 registry: address: zookeeper://172.17.121.58:2181 # 注册中心zookeeper的地址 scan: base-packages: com.jinxin.task.controller # 指定发布的包
在要发布的类上标注上dubbo的@Service注解并将类加入到容器
@Component // 加到容器中 @Service // 导入dubbo的service将服务发布出去 public class DubboService {
配置消费者的dubbo相关属性
dubbo: application: name: provider-ticket # 项目的名字 registry: address: zookeeper://172.17.121.58:2181 # 注册中心zookeeper的地址
远程调用注册中心的类
- 首先需要复制一份跟服务者相同目录的包,带上刚刚发布到的服务中心的DubboService的接口
- 然后使用@Reference远程调用DubboService即可
@Reference DubboService dubboService;
Spring Boot和Spring Cloud
spring cloud分布式开发五大常用组件
- 服务发现——Netflix Eureka
- 客服端负载均衡——Netflix Ribbon
- 断路器——Netflix Hystrix
- 服务网关——Netflix Zuul
- 分布式配置——Spring Cloud Config
选择Eureka-Server,这个项目用来做注册中心
启用注册中心
1、配置Eureka信息
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
@EnableEurekaServer @SpringBootApplication public class EurekaServerApplication { public static void main(String[] args) { SpringApplication.run(EurekaServerApplication.class, args); } }
之后就可以访问localhost:8761来到eureka服务中心页面了
选择Eureka-Discovery,这个项目用来做注册服务
配置服务提供者信息
server: port: 8001 spring: application: name: provide-ticket # 提供者名字 eureka: instance: prefer-ip-address: true # 注册服务时使用服务的ip地址进行注册 client: service-url: defaultZone: http://localhost:8761/eureka/ # 注册中心的地址
然后启动项目就可以注册到的服务中心了
现在配置一个方法返回一个字符串,因为消费者是通过http请求来去请求中心获取数据的,所以写一个controller
@GetMapping("/ticket") public String getTicket(){ return "《厉害了,我的国》"; }
选择Eureka-Discovery,这个项目用来做服务消费者
配置消费者信息,跟配置服务者相同
server: port: 8200 spring: application: name: consumer-user eureka: instance: prefer-ip-address: true # 注册服务时使用服务的ip地址进行注册 client: service-url: defaultZone: http://localhost:8761/eureka/ # 注册中心的地址
在主程序类中开启发现服务的功能跟注册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(); } }
去注册中心获取数据
@RestController public class BuyTicket { @Autowired RestTemplate restTemplate; @GetMapping("buy") public String buyTicket(String name){ // 发送http请求获取数据 String ticket = restTemplate.getForObject("http://PROVIDE-TICKET/ticket", String.class); return name + "购买了" + ticket; } }