SpringCloud学习笔记

Quartz定时任务用法

1.在 build.gradle 里面添加依赖

compilegroup:'org.quartz-scheduler',name:'quartz',version:'2.3.0'

compile('org.springframework.boot:spring-boot-starter-quartz')

2.

新建一个任务类继承QuartzJobBean  编写定时任务

3.

配置Quartz

例如:

```

package com.kenny.spring.cloud.mircoweatherbasic.Config;

import com.kenny.spring.cloud.mircoweatherbasic.job.WeatherDataSyncJob;

import org.quartz.*;

import org.springframework.context.annotation.Bean;

import org.springframework.context.annotation.Configuration;

@Configuration

public class QuartzConfiguration {

//JobDetail 为哪一个类注册为Job

    @Bean

    public JobDetailweatherDataSyncJobJobDetail(){

return JobBuilder.newJob(WeatherDataSyncJob.class).withIdentity("weatherDataSyncJob")

.storeDurably().build();

    }

//Trigger 为Job添加定时

    @Bean

    public TriggerweatherDataSyncTrigger(){

SimpleScheduleBuilder schedBuilder=SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(2).repeatForever();

        return TriggerBuilder.newTrigger().forJob(weatherDataSyncJobJobDetail()).withIdentity("weatherDataSyncTrigger")

.withSchedule(schedBuilder).build();

    }

}

```


读取XML文件

1.xml文件如下:


2.创建实体类持久化

    首先是根元素

//获取根元素名字

@XmlRootElement(name ="c")

//通过字段访问

@XmlAccessorType(XmlAccessType.FIELD)

public class CityList {

        //子元素名称

        @XmlElement(name ="d")

        private Listlist;

}

子元素

@XmlRootElement(name ="d")

@XmlAccessorType(XmlAccessType.FIELD)

public class City {

        @XmlAttribute(name ="d1")

        private StringcityId;

        @XmlAttribute(name ="d2")

        private StringcityName;

        @XmlAttribute(name ="d3")

        private StringcityCode;

         @XmlAttribute(name ="d4")

            private Stringprovince;

}

3.创建一个工具类使xml转为实体对象

public static ObjectxmlStrObject(Class clazz,String xmlStr)throws Exception{

        Object xmlObject=null;

        Reader reader=null;

        JAXBContext context=JAXBContext.newInstance(clazz);

        //XML转为对象的接口

        Unmarshaller unmarshaller=context.createUnmarshaller();

        reader=new StringReader(xmlStr);

        xmlObject=unmarshaller.unmarshal(reader);

        if(reader!=null){

              reader.close();

        }

        return xmlObject;

}

4.使用工具类

public ListcityList()throws Exception {

//读取XML文件

    Resource resource=new ClassPathResource("citylist.xml");

    BufferedReader bufferedReader=new BufferedReader(new InputStreamReader(resource.getInputStream(),"utf-8"));

    StringBuffer buffer=new StringBuffer();

    String line="";

    while ((line=bufferedReader.readLine())!=null){

buffer.append(line);

    }

        bufferedReader.close();

       //XML数据转化为Java对象

        CityList cityList= (CityList) XmlBuilder.xmlStrObject(CityList.class,buffer.toString());

        return cityList.getList();

}


Eureka注册服务器搭建

1.导入依赖:

//Eureka Server

compilegroup:'org.springframework.cloud',name:'spring-cloud-starter-netflix-eureka-server',version:'2.0.1.RELEASE'

//SpringCloud

compilegroup:'org.springframework.cloud',name:'spring-cloud-dependencies',version:'Finchley.RELEASE',ext:'pom'

2.

在启动类添加注解

@EnableEurekaServer

3.编写配置文件

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/


Eureka客户端搭建

1.导入依赖

//客户端要加入这个依赖   重点!!!!

implementation('org.springframework.boot:spring-boot-starter-web')

//Eureka Server

  compilegroup:'org.springframework.cloud',name:'spring-cloud-starter-netflix-eureka-client',version:'2.0.1.RELEASE'

  //SpringCloud

  compilegroup:'org.springframework.cloud',name:'spring-cloud-dependencies',version:'Finchley.RELEASE',ext:'pom'

2.启动类添加注解

@EnableDiscoveryClient

3.编写配置文件

spring:

    application:

        name: mirco-weather-eureka-client

eureka:

    client:

        service-url:

            defaultZone: http://localhost:8761/eureka/


Feign客户端使用

Feign 是一个声明web服务客户端,这便得编写web服务客户端更容易,使用Feign 创建一个接口并对它进行注解,它具有可插拔的注解支持包括Feign注解与JAX-RS注解,Feign还支持可插拔的编码器与解码器,Spring Cloud 增加了对 Spring MVC的注解,Spring Web 默认使用了HttpMessageConverters, Spring Cloud 集成 Ribbon 和 Eureka 提供的负载均衡的HTTP客户端 Feign.

1.导入依赖

implementation('org.springframework.boot:spring-boot-starter-web')

//Eureka Client

  compilegroup:'org.springframework.cloud',name:'spring-cloud-starter-netflix-eureka-client',version:'2.0.1.RELEASE'

  //SpringCloud

  compilegroup:'org.springframework.cloud',name:'spring-cloud-dependencies',version:'Finchley.RELEASE',ext:'pom'

//Feign

compilegroup:'org.springframework.cloud',name:'spring-cloud-starter-openfeign',version:'2.0.1.RELEASE'

2.在启动类添加注解

@EnableDiscoveryClient

@EnableFeignClients

3.编写配置文件

spring:

    application:

        name: mirco-weather-eureka-client-feign

eureka:

    client:

        service-url:

            defaultZone: http://localhost:8761/eureka/

feign:

    client:

        config:

            feignName:

                connectTimeout: 5000#连接超时时间

                readTimeout: 5000#读数据超时时间

server:

    port:8085

4.创建Service层

创建一个接口

如:

//服务名字

@FeignClient("msa-weather-city-eureka")

    public interface CityClient {

        //服务接口

       @GetMapping("/cities/list")

       StringlistCity();

}

5.创建控制层测试

@RestController

public class CityController {

     @Autowired

     private CityClientcityClient;

    @GetMapping("/cities")

    public StringlistCity(){

    String body=cityClient.listCity();

            return body;

    }

}


API网关Zuul

api网关用于管理各个微服务的沟通,集合在一起

使用步骤:

1.导入依赖

//Zuul

compilegroup:'org.springframework.cloud',name:'spring-cloud-starter-netflix-zuul',version:'2.0.1.RELEASE'

2.在启动类添加注解

@EnableZuulProxy

3.编写配置文件

zuul:

    routes:

        hi:

            path: /city/**

            serviceId: msa-weather-city-eureka#转发名字

用于将path: /city/**开头的请求转发到msa-weather-city-eureka的微服务上


使用Spring Cloud Config配置

将配置文件统一管理,放在git上

搭建Spring Cloud Config Server服务

1.添加依赖

//Spring Cloud Config Server

compilegroup:'org.springframework.cloud',name:'spring-cloud-config-server',version:'2.0.1.RELEASE'

2.在启动类添加注释

@EnableConfigServer

3.编写配置文件

spring:

    application:

        name: mirco-weather-eureka-config-server

    cloud:

        config:

            server:

                git:

                    uri: https://github.com/waylau/spring-cloud-microservices-development   #git路径

                search-paths: config-repo  #查找路径

eureka:

    client:

        service-url:

            defaultZone: http://localhost:8761/eureka/


搭建Spring Cloud Config Client客户端

1.添加依赖

//Spring Cloud Config Client

compilegroup:'org.springframework.cloud',name:'spring-cloud-config-client',version:'2.0.1.RELEASE'

2.在控制类添加依赖

@EnableDiscoveryClient

3.编写配置文件

spring:

    application:

        name: micro-weather-config-client

    cloud:

        config:

            profile: dev

            uri: http://localhost:8888/  #配置服务地址

eureka:

    client:

        service-url:

            defaultZone: http://localhost:8761/eureka/

4.通过

@Value("${auther}")

private Stringauther;

获取配置信息


注意:git的配置文件格式


application:服务名

profile:环境

label:分支(branch)

注意客户端名字是否和application一致


集成Hystrix

  在一个分布式系统里,许多依赖不可避免的会调用失败,比如超时、异常等,如何能够保证在一个依赖出问题的情况下,不会导致整体服务失败,这个就是Hystrix需要做的事情。Hystrix提供了熔断、隔离、Fallback、cache、监控等功能,能够在一个、或多个依赖同时出现问题时保证系统依然可用。

 如何使用

1.添加依赖

//Hystrix

compilegroup:'org.springframework.cloud',name:'spring-cloud-starter-netflix-hystrix',version:'2.0.1.RELEASE'

2.在启动类添加注解

    2.1@EnableCircuitBreaker

3.在控制层添加注解

@HystrixCommand(fallbackMethod ="defaultCities")

defaultCities为自定义的回调函数

3.另一种

    在调用API网关的服务接口添加

    @FeignClient(name ="mirco-weather-eureka-client-zuul",fallback = DataClientFallBack.class)

    DataClientFallBack:这个类实现这个接口,为这个接口的每个函数重写回调函数

4.如何测试

当有异常的时候就会调用回调函数


配置熔断

一共有三个状态 打开 关闭 和半打开

当达到下面配置熔断条件的时候,则会熔断.熔断后经过一段时间会尝试再次打开服务,这个时候的状态为半打开状态,他会尝试让请求转到主业务逻辑上,看是否请求成功,当请求成功达到一定的数值时候就会变为打开状态,如果失败则继续为关闭状态.

@HystrixCommand(commandProperties = {

@HystrixProperty(name ="circuitBreaker.enabled",value ="true"), //设置熔断开启状态

        @HystrixProperty(name ="circuitBreaker.requestVolumeThreshold",value ="10"),//当在配置时间窗口内达到此数量的失败后,进行短路。默认20个

        @HystrixProperty(name ="circuitBreaker.sleepWindowInMilliseconds",value ="10000"),//短路多久以后开始尝试是否恢复,默认5s

        @HystrixProperty(name ="circuitBreaker.errorThresholdPercentage",value ="60"),//出错百分比阈值,当达到此阈值后,开始短路。默认50%

})

Hystrix可视化工具使用

1.引入依赖

    groupId:org.springframework.cloud

    artifactId:spring-cloud-starter-hystrix-dashboard

2.在启动类添加注解

@EnableHystrixDashboard

3.添加配置文件

@Component

public class ServletRegistrationConfig {

@Bean

    public ServletRegistrationBeangetServlet() {

HystrixMetricsStreamServlet streamServlet =new HystrixMetricsStreamServlet();

        ServletRegistrationBean registrationBean =new ServletRegistrationBean(streamServlet);

        registrationBean.setLoadOnStartup(1);

        registrationBean.addUrlMappings("/hystrix.stream");

        registrationBean.setName("HystrixMetricsStreamServlet");

        return registrationBean;

    }

}

4.打开管理界面

http://localhost:8082/hystrix

Eureka高可用集群

部署多个Eureka服务,当其中一个服务down掉之后能有其他服务顶替!

3个服务集群为例:


服务端

Server application.yml文件配置

spring:

    application:

        name: eureka-server


---

spring:

    profiles: discovery1

server:

    port:8761

eureka:

    instance:

        hostname: localhost

    client:

        service-url:

            default-zone: http://localhost:8762/eureka/,http://localhost:8763/eureka/

---

spring:

    profiles: discovery2

server:

    port:8762

eureka:

    instance:

        hostname: discovery2

    client:

        service-url:

            default-zone: http://localhost:8761/eureka/,http://localhost:8763/eureka/

---

spring:

    profiles: discovery3

server:

    port:8763

eureka:

    instance:

        hostname: localhost

    client:

        service-url:

            default-zone: http://localhost:8761/eureka/,http://localhost:8762/eureka/


客户端:

spring:

    application:

        name: eureka-client

eureka:

    client:

        service-url:

            defaultZone: http://localhost:8761/eureka/,http://localhost:8762/eureka/,http://localhost:8763/eureka/



服务方通信问题

被调用的服务通过新建一个类    XXXClient

@FeignClient(name ="服务名字")向外提供接口


调用方引入被调用方的依赖,然后自动注入服务方XXXClient使用他的方法


不要将数据库表映射的实体类暴露出去

不要重复定义实体类,该属于哪个服务就哪个服务

自己服务接口自己定义,不要在其他服务写Client


mvn -Dmaven.test.skip=true -U clean install:将项目安装到maven仓库


配置Config Client服务注意

因为获取配置要先从eureka寻找config server 所以先要在bootstrap.yml文件中配置eureka地址.如果不配置他只能在默认得eureka端口寻找.


docker启动RabbitMQ

docker run -d --hostname my-rabbit -p 5672:5672 -p 15672:15672 rabbitmq:3.7.8-management


ConfigServer 当配置文件修改自动刷新配置


原理: config-server会从远端的git拉取配置文件存放到本地的git,各微服务通过配置服务中心获取自己的配置文件,

如何动态的获取自己的配置文件呢?

当远程git端配置文件发生改变的时候,通过webhooks(事件钩子,相当于触发事件),然后对config-server进行一个bus-refresh的post请求,config-server就会重新获取新的配置给下面的组件.

curl -v -X POST "http://localhost:9001/actuator/bus-refresh" 对配置服务中心发起一个POST请求达到刷新效果

github的webhooks URL格式:http://f950340e.ngrok.io/monitor

content-type:application/json

使用

在客户端和服务端都需要添加spring-cloud-starter-bus-amqp依赖

服务端

还要添加

在配置文件添加

spring-cloud-config-monitor依赖 用于自动更新

management:
    endpoints:

        web:

            exposure:

                include:"*"

客户端

    对需要拉取的配置文件字段添加@RefreshScope注解

    表示要在这个作用域进行刷新


Zuul中增加跨域就可以不用改动其他服务代码

实现,编写一个配置类

@Configuration

public class CorsConfig {

@Bean

    public CorsFiltercorsFilter(){

final UrlBasedCorsConfigurationSource source=new UrlBasedCorsConfigurationSource();

        final CorsConfiguration config=new CorsConfiguration();

        //是否支持cookie跨域

        config.setAllowCredentials(true);

        //http:/www.a.com

        config.setAllowedOrigins(Arrays.asList("*"));

        config.setAllowedHeaders(Arrays.asList("*"));

        config.setAllowedMethods(Arrays.asList("*"));

        //缓存时间

        config.setMaxAge(300l);

        source.registerCorsConfiguration("/**",config);

        return new CorsFilter(source);

    }

}


Spring Cloud Sleuth 链路监控

1.添加依赖

spring-cloud-starter-zipkin

包含sleuth和zipkin

2.可视化工具 使用zipkin

docker命令: docker run-d-p9411:9411 openzipkin/zipkin

3.填写配置文件

spring:

    zipkin:#zipkin路径

      base-url: http://localhost:9411/

    sleuth:

        sampler:

            probability: 1#抽样百分比  生产环境可以设置为百分百


docker启动 eureka:docker run -p 8761:8761 -d hub.c.163.com/springcloud/eureka


rancher是用来进行管理dokcer应用的

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,189评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,577评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,857评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,703评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,705评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,620评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,995评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,656评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,898评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,639评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,720评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,395评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,982评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,953评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,195评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,907评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,472评论 2 342

推荐阅读更多精彩内容