SpringCloud
SpringCloud不是某一个具体的技术,而是一系列框架的有序集合,是分布式系统的整体解决方案。
eg:用户-电影举例
注册中心-Eureka
- 项目创建时加上Eureka Service模块
- 若pom.xml文件出错,可以试试加上maven的版本号配置
- 配置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/
- 启动类标记@EnableEurekaServer注解
服务端(电影服务)
目的:完成一次按照id查电影票的功能。
- 项目创建时加上Eureka Discovery Client模块。
- 加逻辑模块@RestController == @Controller+@Response。
- application.yml配置:项目名+端口号+注册中心url+IP保护。
- 启动类标记@EnableDiscoveryClient:启动服务注册和发现功能。
心跳机制:服务端每隔一段时间向注册中心发送“一条信息”以此来告知注册中心“我还活着”。
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的方式
业务逻辑部分代码:MovieController.java
@ResponseBody
@GetMapping("/getMovieById/{id}")
public Movie getMovieById(@PathVariable("id")Integer id) {
return movieService.getMovieById(id);
}
服务端(用户服务)
目的:完成一次通过地址栏按照Id查用户的功能。
- 项目创建时加上Eureka Discovery Client模块
- 启动类标记@EnableDiscoveryClient
- 配置application.yml文件(与电影服务模块基本相同)
- 其他部分和电影服务相同
业务逻辑部分代码:UserController.java
@ResponseBody
@GetMapping("/getUserById/{id}")
public User getUserById(@PathVariable("id") Integer id) {
return userService.getUserById(id);
}
远程调用:
目的:让用户服务去调用电影服务。
通常远程调用的几个方法:
- 采用RestTemplate
- 采用Feign
- RPC
远程调用–RestTemplate
- 配置类声明一个RestTemplate方法,用于返回一个RestTemplate对象,并标记@Bean
@LoadBalanced //负载均衡,如果调用者填写的url是被调用者的服务名,则需要标记负载均衡注解。这句话下文会解释。
@Bean
public RestTemplate restTemplate(){
return new RestTemplate();
}
- RestTemplate对象有很多方法,其中getForObject就可以进行远程调用,其中第一个参数是url,它可以用注册中心的服务的名,此外若用占位符传参,可以拼接字符串,第二个参数为被调用方法返回类型。
eg:
Movie movie = restTemplate.getForObject("http://CLOUD-PROVIDER-MOVIE/getMovieById/"+movieId, Movie.class);
//上面参数中填写的是服务的名,因此需要在配置类中获取restTemplate的方法头上标记@LoadBalance
3.若上诉没成功,则尝试依赖一下Ribbon模块。