【1】什么是Spring Cloud
Spring Cloud是一个分布式的整体解决方案。Spring Cloud 为开发者提供了在分布式系统(配置管理,服务发现,熔断,路由,微代理,控制总线,一次性token,全局琐,leader选举,分布式session,集群状态)中快速构建的工具,使用Spring Cloud的开发者可以快速的启动服务或构建应用、同时能够快速和云平台资源进行对接。
SpringCloud分布式开发五大常用组件
服务发现——Netflix Eureka
客服端负载均衡——Netflix Ribbon
断路器——Netflix Hystrix
服务网关——Netflix Zuul
分布式配置——Spring Cloud Config
测试如下:建立一个空工程,空工程中创建三个Module:eureka-server,consumer-user和provider-ticket。
【1】建立eureka-server注册中心
引入依赖:
<dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka-server</artifactId> <!-- 注意这里表明为服务器端--> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>${spring-cloud.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>
测试如下:建立一个空工程,空工程中创建三个Module:eureka-server,consumer-user和provider-ticket。
【1】建立eureka-server注册中心
引入依赖:
<dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka-server</artifactId> <!-- 注意这里表明为服务器端--> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>${spring-cloud.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>
编写配置文件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/
项目如下所示:
主配置类添加注解@EnableEurekaServer:
@EnableEurekaServer @SpringBootApplication public class EurekaServerApplication { public static void main(String[] args) { SpringApplication.run(EurekaServerApplication.class, args); } }
启动注册中心项目,浏览器访问http://localhost:8761/:
此时注册中心中还没有任何服务实例!
【2】创建服务提供者并进行注册
引入依赖如下:
<dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka</artifactId> <!--这里表明为客户端--> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>${spring-cloud.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>
服务提供者如下:
配置文件如下:
server: port: 8002 spring: application: name: provider-ticket eureka: instance: prefer-ip-address: true # 注册服务的时候使用服务的ip地址 client: service-url: defaultZone: http://localhost:8761/eureka/
主程序类如下:
@SpringBootApplication @EnableEurekaClient//本服务启动后会自动注册进eureka服务中 public class ProviderApplication { public static void main(String[] args) { SpringApplication.run(ProviderApplication.class, args); } }
启动服务提供者,然后查看浏览器注册中心页面:
此时注册中心中就有了服务提供者的一个实例!
浏览器测试服务提供者如下:
将服务提供者部署多个实例
修改TickerController如下:
@Value("${server.port}") String port; // SpringCloud 整合微服务时是按照轻量级的HTTP进行通信 @GetMapping("/ticket") public String getTicker(){ System.out.println("端口:"+port); return ticketService.getTicket(); }
修改application.yml中的server.port 分别为8001和 8002 ,然后使用Maven打包,在CMD中运行两个jar包。
- 打的两个jar包
启动8001
启动8002
此时再次查看注册中心:
【3】创建服务消费者并注册和发现服务
引入依赖如下:
<dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>${spring-cloud.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>
主配置类如下:
import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; import org.springframework.cloud.client.loadbalancer.LoadBalanced; import org.springframework.context.annotation.Bean; import org.springframework.web.client.RestTemplate; @EnableDiscoveryClient//开启发现服务功能 @SpringBootApplication public class ConsumerApplication { public static void main(String[] args) { SpringApplication.run(ConsumerApplication.class, args); } @LoadBalanced//开启负载均衡机制 @Bean public RestTemplate restTemplate(){ return new RestTemplate(); // 用来发送http请求 } }
这里需要注意手动往容器中注册了RestTemplate,其提供了多种便捷访问远程Http服务的方法,是一种简单便捷的访问restful服务模板类,是Spring提供的用于访问REST服务的客户端模板工具类。
UserController如下:
@RestController public class UserController { @Autowired RestTemplate restTemplate; @GetMapping("/buy") public String butTicket(String name){ String s = restTemplate.getForObject("http://PROVIDER-TICKET/ticket", String.class); return name+"购买了"+s; } }
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/
将服务消费者项目启动,查看浏览器注册中心:
访问服务消费者的买票方法(http://192.168.2.101:8200/buy?name=张三):
当服务消费者接收到该请求时,就会使用RestTemplate访问远程服务提供者注册的服务获取数据然后返回。
发起三次请求,分别查看两个服务提供者的窗口:
发起四次请求,分别查看两个服务提供者的窗口:
说明确实使用了负载均衡机制(默认为轮询机制)!!!