公司要测试一下zipkin是否可以跟踪全流程,项目的架构比较复杂,不要问我为什么,基本架构如下:前端门户,调用spring cloud组件,spring cloud在调用dubbo,这样一套流程。于是在spring cloud以及dubbo搭建过程中的所坑所思所想,记录一下。

  ZUUI配置服务出错

不知为何在ZUUI里面配置serviceId无法从Eureka里面获取服务名称;但是如果配置为url,则可以跳转。

问题:为什么服务没有配通,怎么配服务,serviceId是对应Eureka里面的Application Name吗?

拿“http://localhost:8083/springcloudapp/hello/JIm”来举例,其实springcloudapp部分其实服务部分,即你想要请求的服务(或者说服务所在机器的IP:Port,这些信息在Eureka里面存放,交给ZuuL就行了),/hello/Jim才是真正的要IP地址之后的请求信息。但是发现如果是服务部分是服务名称(Eureka里面的Application)没有问题,但是但是假如是下面的定义方式,路径转服务,则失败;

     zuul:
routes:
hello:
path: /hello/*
serviceId: springcloudapp

后来调研发现原来path路径一个“*”只能匹配一个"/"内容,想要匹配多个“/"内容,需要添加"**",才可以匹配上http://localhost:8083/springcloudapp/hello/JIm;这种匹配方式是参考了Ant的匹配规则

    zuul:
routes:
hello:
path: /hello/**
serviceId: springcloudapp

问题解决。

问题:为什么ZUUI没有在Eureka里面注册?

添加一下依赖即可。

    <dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>

其实经过配置,只要在日志中看到如下的内容,及说明配置注册到Eureka是生效的:

demoService为空

原来需要把consumer.xml文件放到WEB-INF下面,然后在web.xml中进行配置(在servlet节点下配置param-value);这里其实有一个问题,就是application和WEB工程之间的差别,就是Spring配置文件的放置;application有默认放置就是class-path下面;但是对于web工程,则需要进行显式的声明(或者默认是servlet-name同名的.xml文件)。也就是说配置文件编译的路径有差异;

     <servlet>
<servlet-name>spring-webmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/consumer.xml,/WEB-INF/spring-webmvc-servlet.xml</param-value>
</init-param>
</servlet>

除此之外工程引用上也有区别,体现在application的工程只需要在pom文件中引用对应的内容;但是对于web工程处理在pom文件中需要处理(用于保证代码编译不出错),还需要在asembly deployment中添加工程引用,才能保证运行是能够正常找到类文件。

  其实到了最后你会发现,consumer.xml和spring-webmvc-servlet.xml其实可以合并为一个,关键是要理解xml里面的标签,比如xml文件中声明dubbo标签(例如,dubbo:annotation),你就需要在beans中声明dubbo的命名空间xmlns:dubbo="http://code.alibabatech.com/schema/dubbo";当然这个网址是否存在并不重要;但是xml解析器将会校验所有的出现的标签需要在beans中声明其命名空间。之所以很多时候spring-mvc.xml和applicationContext会分开更多的是出于清晰的原因,否则其实所有的spring的配置文件都可以捏在一起。

添加了zipkin之后,dubbo的web-consumer报错:

Invalid bean definition with name 'tracing' defined in ServletContext resource [/WEB-INF/applicationContext.xml]: Could not resolve placeholder 'zipkin.dubbo-consumer-web' in string value "${zipkin.dubbo-consumer-web}"; nested exception is java.lang.IllegalArgumentException: Could not resolve placeholder 'zipkin.dubbo-consumer-web' in string value "${zipkin.dubbo-consumer-web}"

直接写名字不再用${}的形式。

java.lang.ClassNotFoundException: org.springframework.web.servlet.DispatcherServlet

惊讶于竟然是因为在Deployment Assembly中,把maven Dependency路径给删掉!重新添加上,问题解决。这个是在google上的stackoverflow中找到的答案。整整调了我大概一个小时。好像是说对pom文件做了比较大的改动之后,Deployment assembly这个引用就会丢失。

log4j的2.0版本下载失败;

但是我的pom文件里面并没有引用log4j,parent的pom文件里面使用的是log4j的1.2.7版本;后来发现:我在properties里面定义了<log4j.version>2.10.0</log4j.version>这样的内容;其实只是靠过来的有腐臭的配置而已;但是也不行,他会自己去找并认为是maven中的一项,因为下载失败而报错。

发现dubbo的web工程并没有整合zipkin的日志。

我推测可能是因为web.xml里面没有配置filter导致,添加了filter,后又报错,说是需要添加contextListener,它两是同步添加的吗?研究了一下代码是因为DelegateFilter(brave里面的默认Filter)将会调用spring的WebApplicationContextUtils.getRequiredWebApplicationContext去获取Context,在Context里面将会要求配置context listener,没配置将会报错。

添加上了listener和filter之后可以正常输出日志。

Eureka启动的时候报错tomcat异常Address already in use: bind/Tomcat connector in failed state

这种内嵌tomcat的机制不是spring cloud,其实是spring boot的机制;除了内嵌tomcat,还内置了jetty;后来通过netstat -ano | findstr 8761(8761是Eureka的监听端口)发现确实还在被监听;通过任务管理器通过PID找到了对应的进程删除,问题解决。

在spring cloud的AppServer里面调用restTemplate报错:java.lang.IllegalStateException: No instances available for 127.0.0.1

这个异常是因为我在代码总restTemplate是通过autowired方式获取实例的,这种方式restTemplate已经绑定到了Ribbon上面去了;可以通过直接实例化restTemplate的方式来获取restTempate,不再使用@autowired。

但是,现在的问题是,什么是ribbon?

Spring cloud提供的负载均衡组件;当两个注册服务同属于一个服务的时候,在客户端通过ribbon进行控制,第一次访问A设备,第二次访问B设备。

springCloud在添加zipkin发生了问题,就是配置问题;appServer不是web工程,很多之前基于web工程的配置都用上。

我突然想到其实spring cloud原生应该就该支持zipkin的;在网上一搜果然如此。我下载了一份源码,其实只要添加如下依赖即可。

     <dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-sleuth</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zipkin</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-rest</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>

然后还要在配置文件(yaml或者properties文件)中添加:spring.zipkin.base-url=http://localhost:9411/;

在调查的过程中还发现zipkin也可以作为一个单独的工程出现,然后所有的对于zipkin的配置都可以在这个工程中进行配置。

ClassNotFound: org.springframework.boot.autoconfigure.condition.ConditionMessage

发现是因为少包,spring-boot-autoconfigure,于是添加了这个包的依赖,但是没有写版本;结果发现了下面的异常;

NoSuchMethodException: org.springframework.boot.autoconfigure.SharedMetadataReaderFactoryContextInitializer

因为autoconfig默认是1.2.8版本的;所以我觉得可能是因为版本问题,于是直接升到最新的是2.0x,但是不行,改为爆了上面的异常,XX方法找不到,之后就是N次降版本尝试。无解啊,于是我又拿下了svn的上面的demo,照样搞了一下,编译是成功了,但是zipkin没有反应。

后来我觉得很可能是springcloud配置问题,我又从网上下载了一套spring cloud的demo源码,发现可用。值得深思。

问题:为什么公司项目的@autowired不好用,无法实例化restTemplate?

未解决

Caused by: java.lang.IllegalStateException: Unable to find a single main class from the following candidates
工程里面有两个main函数,注释掉一个,问题解决
 
Cannot determine embedded database driver class for database type NONE
添加@EnableAutoConfiguration(exclude={DataSourceAutoConfiguration.class})

参考

https://www.cnblogs.com/brant/p/6298342.html

https://blog.csdn.net/qq_26562641/article/details/53336899#reply

https://blog.csdn.net/caicongyang/article/details/52974406

http://www.baeldung.com/zuul-load-balancing

https://blog.csdn.net/noaman_wgs/article/details/70214612

https://github.com/ameizi/dubbo-example

spring cloud zip的demo

https://howtodoinjava.com/spring/spring-cloud/spring-cloud-zipkin-sleuth-tutorial/

ZUUL的配置到Eureka服务发现

https://blog.csdn.net/zhanglh046/article/details/78651914

 

搭建Spring Cloud+Dubbo的更多相关文章

  1. maven 聚合工程 用spring boot 搭建 spring cloud 微服务 模块式开发项目

    项目的简单介绍: 项目采用maven聚合工程 用spring boot 搭建 spring cloud的微服务 模块式开发 项目的截图: 搭建开始: 能上图 我少打字 1.首先搭建maven的聚合工程 ...

  2. 搭建spring cloud config

    很久没更新了,因为不是专职研究spring cloud,因此更新速度得看工作强度大不大,每天能抽出的时间不多,如果更新太慢了,并且有小伙伴看的话,请见谅了. Spring Cloud简介 Spring ...

  3. Spring Cloud+Dubbo对Feign进行RPC改造

    因为Spring Cloud Feign是基于Http Restful的调用,在高并发下的性能不够理想(虽然他是基于Ribbon以及带有熔断机制,可以防止雪崩),成为性能瓶颈,所以我们今天对Feign ...

  4. 以zookeeper为注册中心搭建spring cloud环境

    在spring cloud体系中,有多种手段实现注册中心,本例中采用zookeeper作为注册中心的角色.服务提供者向zookeeper注册,服务消费者从zookeeper中发现服务提供者的相关信息, ...

  5. spring cloud & dubbo

    区别 来源(背景): Dubbo,是阿里巴巴服务化治理的核心框架,并被广泛应用于阿里巴巴集团的各成员站点. Spring Cloud,从命名我们就可以知道,它是Spring Source的产物,Spr ...

  6. 只需五分钟-用Maven快速搭建Spring Cloud微服务

    Maven安装手册 1.准备安装包 安装包: apache-maven-3.5.4-bin.zip  (最好JDK 1.7及以上版本) 集成包: eclipse-maven3-plugin.zip 2 ...

  7. Docker composer搭建Spring Cloud Alibaba 运行环境(二)

    " Spring Cloud Alibaba要用到的组件很多,注册中心nacos, 限流sentinel, 数据库,网关等等.由于用到的组件相对较多,部署会很繁琐,最关键的是没有资源服务器, ...

  8. 从零搭建Spring Cloud Gateway网关(一)

    新建Spring Boot项目 怎么新建Spring Boot项目这里不再具体赘述,不会的可以翻看下之前的博客或者直接百度.这里直接贴出对应的pom文件. pom依赖如下: <?xml vers ...

  9. 从零搭建Spring Cloud Gateway网关(二)—— 打印请求响应日志

    作为网关,日志记录是必不可少的功能,可以在网关出增加requestId来查询整个请求链的调用执行情况等等. 打印请求日志 打印请求日志最重要的就是打印请求参数这些东西,不过RequestBody通常情 ...

随机推荐

  1. EBS Certifications

    Last Updated: September 29, 2017.  This summary cross-references published blog articles and the off ...

  2. Highcharts 时间序列,可缩放的图表;Highcharts X 轴翻转曲线图;Highcharts 带标记曲线图

    Highcharts 时间序列,可缩放的图表 配置 图表 配置可缩放图表. chart.zoomType 指定了用户可以拖放的尺寸,用户可以通过拖动鼠标来放大,可能值是x,y或xy: var char ...

  3. js排序算法03——选择排序

    选排序的思路是首先从要排序的数组中选择最小的和目前的第一位交换位置,然后从剩下的数中选择最小的和第二个位置的数交换位置,再从剩下的数中选择最小的和第三个位置的数交换位置,以此类推,实现代码如下: fu ...

  4. 3: 组件间的依赖管理 Managing Dependencies Between Components Using the Prism Library 5.0 for WPF(英汉对照版)

    Applications based on the Prism Library are composite applications that potentially consist of many ...

  5. LeetCode OJ:Find Median from Data Stream(找数据流的中数)

    Median is the middle value in an ordered integer list. If the size of the list is even, there is no ...

  6. 【ecmascript】Javascript 严格模式详解【转】

    一.概述 除了正常运行模式,ECMAscript 5添加了第二种运行模式:"严格模式"(strict mode).顾名思义,这种模式使得Javascript在更严格的条件下运行. ...

  7. Spring整合Hibernate:2、使用Annotation方式进行声明式的事务管理

    1.加入DataSourceTransactionManager的命名空间 修改applicationContext.xml文件,增加如下内容: 1 2 3 4 5 6 7 8 9 10 11 12 ...

  8. android mvp RxJava 框架结构分析

    一个MVP结构:M是model,V是Fragment,P是提供者,P持有V和Model,控制获取数据并给V赋值.(结合了RXJava Retrofit和okHttp)

  9. New Concept English three(14)

    06:55:29 32w/m 45words. There was a time when the owners of shop and businesses in Chicago had to pa ...

  10. Linux下保存文件

    经常需要dump数据,mark一下 #if 0 FILE * fd = NULL; fd = fopen("/mnt/raw.pcm", "ab+"); if ...