1)springclod与dubbo的区别:
dubbo是一个分布式服务框架,主要解决服务直接远程调用问题(服务直接的RPC);springclod是分布式的整体解决方案,在分布式系统中需要考虑的几乎所有问题(配置管理,服务发现,熔断,路由,微代理,控制总线,一次性token,全局琐,leader选举,分布式session,集群状态),都有对应的解决方案。
2)SpringCloud分布式开发五大常用组件
服务发现——Netflix Eureka
客服端负载均衡——Netflix Ribbon
断路器——Netflix Hystrix
服务网关——Netflix Zuul
分布式配置——Spring Cloud Config
3)springboot整合springcloud
a、创建3个模块(注册中心Eureka-server、服务提供者、服务消费者)
配置文件
<!--注册中心-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
<!--消费者/提供者-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
c、配置注册中心模块Eureka信息
#服务端口号(注册中心)
server.port=8761
#指定eureka实例的主机名
eureka.instance.hostname=eureka-server
#eureka客户端信息
#register-with-eureka=false:不把eureka本身注册在注册中心,true时把本身也注册到注册中心
#fetch-registry=false:不从eureka上来获取服务的注册信息(因为本身是注册中心,不需要像消费者一样去获取注册信息)
#service-url:注册中心地址;默认http://localhost:8761/eureka/
eureka.client.register-with-eureka=false
eureka.client.fetch-registry=false
eureka.client.service-url.defaultZone=http://localhost:8761/eureka/
d、启用注册中心功能@EnableEurekaServer
e、启动注册中心测试:访问http://127.0.0.1:8761/
f、将服务提供者注册到注册中心
编写一个服务
package com.test.ticket.service;
import org.springframework.stereotype.Service;
@Service
public class TicketService {
public String getTicket(){
return "《故乡,故乡》";
}
}
为使其可以访问,编写一个controller
package com.test.ticket.controller;
import com.test.ticket.service.TicketService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class TicketController {
@Autowired
TicketService ticketService;
//springcloud在整合微服务的时候,是通过轻量级http进行通信的
//通过http的方式将接口暴露出来
@GetMapping("/ticket")
public String getTicket(){
return ticketService.getTicket();
}
}
配置服务提供者,将功能注册到注册中心
#服务端口(服务提供者)
server.port=8001
#服务提供者应用名
spring.application.name=provider-ticket
#注册服务时,使用服务的ip地址注册
eureka.instance.prefer-ip-address=true
#service-url:注册中心地址;默认http://localhost:8761/eureka/
eureka.client.service-url.defaultZone=http://localhost:8761/eureka/
启动服务提供者应用,可以正常访问http://127.0.0.1:8001/ticket
刷新注册中心,有一个应用
=====================也可以注册多个应用
分别8001、8002应用,将其打包
使用java -jar命令运行服务jar包,此时如果在消费服务中开启负载均衡功能时,每次会轮流访问这两个服务(8001/8002)
g、消费服务
配置消费服务者
#定义当前应用名字
spring.application.name=consumer-user
#服务访问端口(消费者)
server.port=8200
#注册服务时,使用服务的ip地址注册
eureka.instance.prefer-ip-address=true
#service-url:注册中心地址;默认http://localhost:8761/eureka/
eureka.client.service-url.defaultZone=http://localhost:8761/eureka/
当前应用从注册中心来发现服务,使用注解@EnableDiscoveryClient
从eureka中调用
编写一个处理请求,调用RestTemplate消费服务
package com.test.user.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
@RestController
public class UserController {
@Autowired
RestTemplate restTemplate;
@GetMapping("/buy")
public String buyTicket(String name){
//restTemplate.getForObject("http://请求的服务名/ticket",String.class)
String s = restTemplate.getForObject("http://PROVIDER-TICKET/ticket",String.class);
return name + "购买了" + s;
}
}
启动消费者服务测试,刷新注册中心,发现user也注册进来了
访问浏览器进行测试