一、Spring Cloud

​ Spring Cloud 是一个分布式的整体解决方案。 Spring Cloud 为开发者提供了在分布式系统(配
置管理,服务发现,熔断,路由,微代理,控制总线,一次性 token,全局琐, leader 选举,分
布式 session,集群状态)中快速构建的工具,使用 Spring Cloud 的开发者可以快速的启动服务
或构建应用、同时能够快速和云平台资源进行对接。

SpringCloud 分布式开发五大常用组件

  • 服务发现——Netflix Eureka
  • 客服端负载均衡——Netflix Ribbon
  • 断路器——Netflix Hystrix
  • 服务网关——Netflix Zuul
  • 分布式配置——Spring Cloud Config

二、微服务

image-20201004115122686

Martin Fowler 微服务原文 https://martinfowler.com/articles/microservices.html

三、Spring Cloud 入门

项目结构:

image-20201004132126588

先创建一个空项目来存放

image-20201004115734102

① 编写 EurekaServer 注册中心

image-20201004115837617

1. 项目结构

image-20201004120017699

2.配置 Eureka 信息

1
2
3
4
5
6
7
8
9
10
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/

3.@EnableEurekaServer

1
2
3
4
5
6
7
8
9
@EnableEurekaServer
@SpringBootApplication
public class EurekaServerApplication {

public static void main(String[] args) {
SpringApplication.run(EurekaServerApplication.class, args);
}

}

4.启动

image-20201004120230435

② 编写服务提供者

image-20201004123838302

1.项目结构

image-20201004123915099

2.编写 service 层 和 controller 层

1
2
3
4
5
6
7
8
@Service
public class TicketService {

public String getTicket(){
System.out.println("8001");
return "《姜子牙》";
}
}
1
2
3
4
5
6
7
8
9
10
@RestController
public class TicketController {
@Autowired
TicketService ticketService;

@GetMapping(value = "/ticket")
public String getTicket() {
return ticketService.getTicket();
}
}

3.配置信息

1
2
3
4
5
6
7
8
9
10
11
12
server:
port: 8001
spring:
application:
name: provider-ticket

eureka:
instance:
prefer-ip-address: true # 注册服务的时候使用服务的ip地址
client:
service-url:
defaultZone: http://localhost:8761/eureka/

4.启动

去 Eureka 注册中心查看,http://localhost:8761/eureka/

image-20201004124211173

5.负载均衡

为了显示效果,使用 Maven 仓库的打包,我复制一份提供者,改一下启动端口吗,防止冲突。

image-20201004124634191

image-20201004124707626

  • 把包复制出来存放在文件夹里,并启动

    image-20201004130202319
image-20201004125008899

image-20201004125816434

​ 8002 一样的方法启动即可

  • 注册中心显示,都成功注入

image-20201004130102243

③ 编写服务消费者

image-20201004123838302

1.项目结构

image-20201004131304773

2.编写 controller 和 RestTemplate 模板

1
2
3
4
5
6
7
8
9
10
11
12
@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;
}
}

@EnableDiscoveryClient

image-20201004131528408

1
2
3
4
5
6
7
8
9
10
11
12
13
14
@EnableDiscoveryClient // 开启发现服务功能
@SpringBootApplication
public class ConsumerUserApplication {

public static void main(String[] args) {
SpringApplication.run(ConsumerUserApplication.class, args);
}

@LoadBalanced // 使用负载均衡机制
@Bean
public RestTemplate restTemplate(){
return new RestTemplate();
}
}

3.配置信息

1
2
3
4
5
6
7
8
9
10
11
12
spring:
application:
name: consumer-user
server:
port: 8200

eureka:
instance:
prefer-ip-address: true # 注册服务的时候使用服务的ip地址
client:
service-url:
defaultZone: http://localhost:8761/eureka/

4.启动

image-20201004131611360

  • 负载均衡生效

image-20201004131728346

整合完成!!!