分布式一般使用zookeeper+dubbo或者Spring Boot+Spring Cloud
一、Dubbo简介、安装
关于Dubbo详见Dubbo篇
docker安装zookeeper
docker pull zookeeper
1.分布式-SpringBoot整合Dubbo、zookeeper
服务提供者:
- 引入dubbo、zkClient依赖
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>0.1.0</version>
</dependency>
<dependency>
<groupId>com.github.sgroschupf</groupId>
<artifactId>zkclient</artifactId>
<version>0.1</version>
</dependency>
- 配置应用名、注册中心地址、提供服务的扫描包
dubbo.application.name=provider-ticket
dubbo.registry.address=zookeeper://118.24.44.169:2181
dubbo.scan.base-packages=com.atguigu.ticket.service
- 使用
@Service
标注服务实现类
发布服务
注意:这里的
@Service
是com.alibaba.dubbo.config.annotation.Service
包下的注解。
@Component //加载到容器中
@Service //将服务发布出去
public class TicketServiceImpl implements TicketService {
@Override
public String getTicket() {
return "《厉害了,我的国》";
}
}
服务消费者
- 引入dubbo、zkClient依赖
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>0.1.0</version>
</dependency>
<dependency>
<groupId>com.github.sgroschupf</groupId>
<artifactId>zkclient</artifactId>
<version>0.1</version>
</dependency>
- 配置应用名、注册中心地址
dubbo.application.name=consumer-user
dubbo.registry.address=zookeeper://118.24.44.169:2181
- 使用
@Reference
引用服务
@Reference
注解会根据类名自动从所有发布的服务中找到匹配的服务。
@Service
public class UserService{
@Reference
TicketService ticketService;
public void hello(){
String ticket = ticketService.getTicket();
System.out.println("买到票了:"+ticket);
}
}
二、SpringCloud
SpringCloud拥有一整套分布式解决方案
- 服务发现——Netflix Eureka
- 负载均衡——Netflix Ribbon
- 断路器——Netflix Hystrix
- 服务网关——Netflix Zuul
- 分布式配置——Spring Cloud Config
这里只介绍Eureka服务发现功能。
Eureka服务发现由三个项目组成:注册中心、服务提供者、服务消费者
1.Eureka
1.注册中心
- 引入依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka-server</artifactId>
</dependency>
- 配置相关参数
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/ #注册地址
- 开启注册中心
@EnableEurekaServer
@EnableEurekaServer
@SpringBootApplication
public class EurekaServerApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaServerApplication.class, args);
}
}
2.服务提供者
- 引入依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
- 配置相关参数,然后编写Controller提供服务
server:
port: 8002 #当前服务使用的端口
spring:
application:
name: provider-ticket #当前服务名
eureka:
instance:
prefer-ip-address: true # 注册服务的时候使用服务的ip地址
client:
service-url:
defaultZone: http://localhost:8761/eureka/ #注册地址
3.服务消费者
- 引入依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
- 配置(和服务提供者配置格式相同)
spring:
application:
name: consumer-user
server:
port: 8200
eureka:
instance:
prefer-ip-address: true # 注册服务的时候使用服务的ip地址
client:
service-url:
defaultZone: http://localhost:8761/eureka/
4.调用服务准备
- 开启服务发现功能
@EnableDiscoveryClient
- 给容器中加载调用模板
RestTemplate
- 开启负载均衡机制
@LoadBalanced
@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
调用模板来远程调用服务
@RestController
public class UserController {
@Autowired
RestTemplate restTemplate;
@GetMapping("/buy")
public String buyTicket(String name){
String s = restTemplate.getForObject("http://PROVIDER-TICKET/ticket", String.class);
return name+"购买了"+s;
}
}