一、spring cloud简介
Spring Cloud定制小程序开发为开发人员提供了用于定制小程序开发快速构建中某些常见模式的工具(例如,配置管理,服务发现,断路器,智能路由,微代理,控制总线)。定制小程序开发分布式系统的协调产生定制小程序开发了样板模式,并且使用Spring定制小程序开发云开发人员可以快速支定制小程序开发持实现这些模式的服务定制小程序开发和应用程序。
二、spring cloud搭建
1.定制小程序开发创建空项目
2.创建
1.创建模块
2.添加配置
01.添加注解
@EnableEurekaServer
02.添加配置
server.port #端口
eureka.client.service-url.defaultZone #指定当前eureka客户端的注册地址
eureka.client.register-with-eureka #自身 不在向eureka注册
eureka.client.fetch-registry #启动时禁用client的注册
eureka.instance.hostname #指定应用名称
- server.port=8762
- eureka.instance.hostname=eureka-server
- eureka.client.register-with-eureka=false
- eureka.client.fetch-registry=false
- eureka.client.serviceUrl.defaultZone= http://${eureka.instance.hostname}:${server.port}/eureka/
03.运行项目,项目启动后根据您自定义的端口到浏览器访问,如出现以下图片内容,注册中心配置搭建完成
三、创建服务提供者
1.创建模块
2.添加配置
01.添加注解
02.添加配置
server.port # 服务端口号spring.application.name #服务名称 - 服务之间使用名称进行通讯eureka.instance.hostname= localhosteureka.client.register-with-eureka #是否需要将自己注册到注册中心eureka.client.fetch-registry #需要搜索服务信息eureka.client.service-url.defaultZone # 注册中心服务器地址
- server.port=8071
- spring.application.name=servicesuppot
- eureka.client.register-with-eureka=true
- eureka.client.fetch-registry=true
- eureka.instance.hostname= localhost
- eureka.client.service-url.defaultZone= http://${eureka.instance.hostname}:8763/eureka
03.运行提供者服务,项目启动后去到原先注册中心网页上如出现以下图片内容,微服务配置搭建完成
四、创建服务消费者
同上创建另一个,添加注解与配置
- server.port=8073
- spring.application.name=serviceconsume
- eureka.client.register-with-eureka=true
- eureka.client.fetch-registry=true
- eureka.instance.hostname= localhost
- eureka.client.service-url.defaultZone= http://${eureka.instance.hostname}:8763/eureka
五、服务与服务之前通讯
1.创建接口
- @RestController
- @RequestMapping("/Hello")
- public class Controller {
- @RequestMapping("/World")
- public String helloWorld(String s) {
- System.out.println("名字为:" + s);
- return "名字为:" + s;
- }
- }
重起服务
接口调用成功返回
2.调用服务
01.restTemplate+ribbon
需要一个@Bean的注解自动注入并直接调用restTemplate对象调用服务
- @Configuration
- public class Beans {
- //管理简单对象
- @Bean
- @LoadBalanced
- public RestTemplate getRestTemplate(){
- return new RestTemplate();
- }
- }
- @RestController
- @RequestMapping("/Hello")
- class ConsumerController {
- @Autowired
- private LoadBalancerClient loadBalancerClient;
- @Autowired
- private RestTemplate restTemplate;
- @RequestMapping("/Consumer")
- @HystrixCommand(fallbackMethod = "errorcode")
- public String helloWorld(String s){
- System.out.println("传入的值为:"+s);
-
- String forObject = restTemplate.getForObject("http://client001/Hello/World?s=" + s, String.class);
- return forObject;
- }
02.feign
..........................................
六、关于Feign
Feign是一个http请求调用的轻量级框架,可以以Java接口注解的方式调用Http请求。Spring Cloud引入 Feign并且集成了Ribbon实现客户端负载均衡调用。
1.添加依赖
- <dependency>
- <groupId>org.springframework.cloud</groupId>
- <artifactId>spring-cloud-starter-openfeign</artifactId>
- <version>2.1.1.RELEASE</version>
- </dependency>
2.添加注解
@EnableFeignClients
3.创建service
- @FeignClient("servicesuppot")
- @Service
- public interface HollerService {
- @PostMapping("/Hello/World")
- public String helloWorld(@RequestParam(value = "s") String s);
- }
4.创建接口
- @RestController
- @RequestMapping("/Hello")
- class ConsumerController {
- @Autowired
- HollerService hollerService;
- @RequestMapping("/say")
- public String sayHelloWorld(String s){
- System.out.println("传入的值为:"+s);
- return hollerService.helloWorld(s)+" sayHelloWorld";
- }
- }
重启服务,网页再访问
七、关于Ribbon
Ribbon是一个客户端负载均衡器,它提供了对HTTP和TCP客户端的行为的大量控制。实现Feign调用Ribbon负载均衡的服务提供者
1.添加依赖
- <dependency>
- <groupId>org.springframework.cloud</groupId>
- <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
- </dependency>
2.添加配置
该配置之前已添加过了,只需要重要关注 @LoadBalanced
- @Configuration
- public class Beans {
- //管理简单对象
- @Bean
- @LoadBalanced
- public RestTemplate getRestTemplate(){
- return new RestTemplate();
- }
- }
3.服务测试
服务之间的相互访问完成了 到这里springcloud最基本的环境搭建就完成了,现在我们来创建几个服务来供消费服务去调用
01.启动注册中心服务
02.修改接口
修改一个接口调用端口信息
- @RestController
- @RequestMapping("/Hello")
- public class Controller {
-
- @Value("${server.port}")
- String port;
-
- @RequestMapping("/World")
- public String helloWorld(String s) {
- System.out.println("名字为:" + s);
- return "出于端口为"+port+",名字为:" + s;
- }
- }
03.创建多个服务
04.启动提供服务
启动第一个服务,将prperties配置端口设为:8073 再启动服务
启动第一个服务,将prperties配置端口设为:8072 再启动服务
启动第一个服务,将prperties配置端口设为:8071 再启动服务
到注册中心可以看到同一个服务名称开启了三个端口独立运行服务都顺利运行了
05.启动消费服务
06.接口访问
八、关于Hystrix
Hystrix是供分布式系统使用,提供延迟和容错功能,隔离远程系统、访问和第三方程序库的访问点,防止级联失败,保证复杂的分布系统在面临不可避免的失败时,仍能有其弹性。
意思是:上面我们建立了两个服务eureka-servicesuppot、eureka-serviceconsume ,我们以A,B来称呼。Hystrix 负责监控服务之间的调用情况,当B服务去调用A服务连续多次失败的情况。当调用的服务出现故障时,出现请求堆积、资源占用,慢慢扩散到所有微服务,引发雪崩效应。Hystrix 会进行熔断,调用保护的方法就是使用 Fallback,就可以使用 Fallback 方法的返回值;Hystrix 间隔时间会再次检查故障的服务,如果故障服务恢复,将继续使用服务。
1.添加依赖
- <dependency>
- <groupId>org.springframework.cloud</groupId>
- <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
- <version>2.2.8.RELEASE</version>
- </dependency>
2.添加配置
@EnableHystrix
3.创建fallback方法并添加注解
@HystrixCommand(fallbackMethod = "errorcode")
- public String errorcode(String s){
- return s+"error request";
- }
4.调用服务
项目中的两个微服务eureka-servicesuppot【A服务】、eureka-serviceconsume【B服务】,假定B服务要调用A服务,当A服务异常,此时B服务调用A服务的时候,B服务Hystrix 会进行熔断,调用fallback
1.启动服务
2.调用服务
在这时候会发现此时B服务调用A服务的时候出现故障,就使用 Fallback 方法的返回值;Hystrix 间隔时间会再次检查故障的服务,如果故障服务恢复,将继续使用服务。