Spring Boot和Spring Cloud
Spring Cloud
Spring Cloud是一个分布式的整体解决方案。Spring Cloud 为开发者提供了在分布式系统(配置管理,服务发现,熔断,路由,微代理,控制总线,一次性token,全局琐,leader选举,分布式session,集群状态)中快速构建的工具,使用Spring Cloud的开发者可以快速的启动服务或构建应用、同时能够快速和云平台资源进行对接。
SpringCloud分布式开发五大常用组件
服务发现——Netflix Eureka
客服端负载均衡——Netflix Ribbon
断路器——Netflix Hystrix
服务网关——Netflix Zuul
分布式配置——Spring Cloud Config
Martin Fowler 微服务原文 https://martinfowler.com/articles/microservices.html
Spring Cloud 入门 1、创建provider 2、创建consumer 3、引入Spring Cloud 4、引入Eureka注册中心 5、引入Ribbon进行客户端负载均衡
开发步骤:编写三个模块,eureka,服务提供,服务消费
eureka:开发步骤
1、引入eureka服务依赖
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> </dependency>
jkd9及以上需要手动添加jaxb依赖,不然会报错无法启动,原因是java9模块化的概念使得JAXB默认没有加载;
手动添加依赖,或者用一下命令都可以实现
java9模块命令方式:
--add-modles java.xml.bind
java9默认未加载模块:
javax.activation
javax.corba
javax.transaction
javax.xml.bind
javax.xml.ws
javax.xml.ws.annotation
<!-- jaxb模块引用 - start -->
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
</dependency>
<dependency>
<groupId>com.sun.xml.bind</groupId>
<artifactId>jaxb-impl</artifactId>
<version>2.3.0</version>
</dependency>
<dependency>
<groupId>org.glassfish.jaxb</groupId>
<artifactId>jaxb-runtime</artifactId>
<version>2.3.0</version>
</dependency>
<dependency>
<groupId>javax.activation</groupId>
<artifactId>activation</artifactId>
<version>1.1.1</version>
</dependency>
<!-- jaxb模块引用 - end -->
2、配置相关配置
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在启动类上,开启eureka服务注册
二:开发服务提供
1、引入相关依赖
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency>
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency>
2、添加配置文件
server: port: 8001 spring: application: name: provider-ticket eureka: client: service-url: defaultZone: http://localhost:8761/eureka/ instance: prefer-ip-address: true
3、添加相应的服务代码
//service类
import org.springframework.stereotype.Service;
@Service
public class TicketService {
public String getTicket(){
return "<历史的见证:忍者忍龟>";
}
}
import com.atguigu.providerticket.service.TicketService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class TicketController {
@Autowired
TicketService ticketService;
@GetMapping("ticket")
public String hello() {
return ticketService.getTicket();
}
}
三、开发消费方
1、引入依赖
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency>
2、编写配置文件
server: port: 8002 spring: application: name: cunsumer-user eureka: client: service-url: defaultZone: http://localhost:8761/eureka/ instance: prefer-ip-address: true
3、在启动类上添加注解
@EnableDiscoveryClient:开启获取注册信息
同时需要在启动类上或者配置类将RestTemple加入容器
@LoadBalanced //实现负载均衡 @Bean public RestTemplate restTemplate () { return new RestTemplate(); }
4、编写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 ConsumerController {
@Autowired
RestTemplate restTemplate;
@GetMapping("buy")
public String buyTicket(String name) {
//填写的url是服务名称,后面是http的匹配地址
String s = restTemplate.getForObject("http://provider-ticket/ticket", String.class);
return name+"购买了电影票:"+s;
}
}