天天看点

Springcloud+zipkin实现链路追踪

1.该环境为window环境

2.项目中需要追踪的Module 的pom 文件中引入依赖 zipkin (该包中包含了spring-cloud-starter-sleuth)
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-zipkin</artifactId>
        </dependency>

3.同时还需要启动链路追踪的一个服务jar    zipkin-server-2.11.8-exec.jar    [该jar已经放到说明文件目录中]
    启动命令: java -jar zipkin-server-2.11.8-exec.jar


4.在需要链路追踪中的Module 的 application.yml 文件中增加配置
spring:
    # 链路追踪  启动jar服务,默认端口9411
  zipkin:
    base-url: http://localhost:9411/
    # spring.sleuth.sampler.probability 为采样率,默认为0.1,开发测试设为1.
  sleuth:
    sampler:
      probability: 1

5.7100服务  通过 openFeign 调用 9100服务

6.数据库表结构
DROP TABLE IF EXISTS "public"."t_user";
CREATE TABLE "public"."t_user" (
  "id" varchar(255) COLLATE "pg_catalog"."default" NOT NULL DEFAULT NULL::character varying,
  "user_name" varchar(255) COLLATE "pg_catalog"."default" DEFAULT NULL::character varying,
  "pass_word" varchar(255) COLLATE "pg_catalog"."default" DEFAULT NULL::character varying,
  "nick_name" varchar(255) COLLATE "pg_catalog"."default" DEFAULT NULL::character varying,
  "tele" varchar(255) COLLATE "pg_catalog"."default" DEFAULT NULL::character varying,
  "create_time" timestamp(6) DEFAULT NULL::timestamp without time zone
)
;
COMMENT ON TABLE "public"."t_user" IS '用户表-李庆伟';

INSERT INTO "public"."t_user" VALUES ('1', 'liqingwei', 'c4ca4238a0b923820dcc509a6f75849b', '李老板', '15801174888', '2020-04-28 14:01:06');

ALTER TABLE "public"."t_user" ADD CONSTRAINT "user_t_pkey" PRIMARY KEY ("id");

DROP TABLE IF EXISTS "public"."t_article_news";
CREATE TABLE "public"."t_article_news" (
  "id" varchar(38) COLLATE "pg_catalog"."default" NOT NULL DEFAULT NULL,
  "name" varchar(255) COLLATE "pg_catalog"."default" DEFAULT NULL,
  "contents" varchar(2000) COLLATE "pg_catalog"."default" DEFAULT NULL,
  "author" varchar(255) COLLATE "pg_catalog"."default" DEFAULT NULL
)
;
COMMENT ON COLUMN "public"."t_article_news"."name" IS '文章名称';
COMMENT ON COLUMN "public"."t_article_news"."contents" IS '文章内容';
COMMENT ON COLUMN "public"."t_article_news"."author" IS '文章作者';
COMMENT ON TABLE "public"."t_article_news" IS '文章表';

INSERT INTO "public"."t_article_news" VALUES ('1', '文章1', '内容1', '作者1');
INSERT INTO "public"."t_article_news" VALUES ('3', '文章3', '内容3', '作者3');
INSERT INTO "public"."t_article_news" VALUES ('4', '文章4', '内容4', '作者4');
INSERT INTO "public"."t_article_news" VALUES ('5', '文章5', '内容5', '作者5');
INSERT INTO "public"."t_article_news" VALUES ('2', '文章2', '内容2', '作者2');

ALTER TABLE "public"."t_article_news" ADD CONSTRAINT "t_article_news_pkey" PRIMARY KEY ("id");


7.最后就是通过地址访问:http://localhost:9411/      

代码部分:

A服务代码

import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

import java.util.Map;


/**
 * 链路追踪
 * @author 李庆伟
 * @date 2020/7/19 16:40
 */
@Slf4j
@RestController
@RequestMapping("testRest")
public class TestRestController {

    @Autowired
    private RestTemplate restTemplate;

    private static final String PRO_7001_URL = "http://localhost:7001";

    //跨服务调用
    @GetMapping("testOne") //可以设置方法传参 和 在请求头中设置参数
    public Map<String,Object> getPostForObjectMonth(){
        log.info("链路追踪开始啦啦啦。。。。。。。。。。。");
        // 封装参数,千万不要替换为Map与HashMap,否则参数无法传递
        MultiValueMap<String, Object> paramMap = new LinkedMultiValueMap<String, Object>();
        paramMap.add("pageNo",1);
        paramMap.add("pageSize",1);
        HttpHeaders headers = new HttpHeaders();
        headers.add("ID_Test","hello_testOne_getPostForObjectMonth");
        //headers.add();在请求头中设置传递信息
        HttpEntity<MultiValueMap<String, Object>> httpEntity = new HttpEntity<MultiValueMap<String, Object>>(paramMap,headers);
        Map<String,Object> map = restTemplate.postForObject(PRO_7001_URL+"/user/findUserByPage",httpEntity,Map.class);
        return map;
    }
}
      

B服务

import com.dev.model.User;
import com.dev.service.UserService;
import com.github.pagehelper.PageInfo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletRequest;
import java.util.HashMap;
import java.util.Map;

/**
 * @author 李庆伟
 * @date 2020/7/18 19:46
 */
@RestController
@RequestMapping("user")
public class UserController {

    @Autowired
    private UserService userService;

    /**
     * 分页查询
     * [pageNo, pageSize]
     * @return {@link Map< String, Object>}
     * @throws
     * @author 李庆伟
     * @date 2020/7/19 18:07
     */
    @PostMapping("findUserByPage")
    public Map<String, Object> findUserByPage(Integer pageNo, Integer pageSize, HttpServletRequest request){
        String herderId = request.getHeader("ID_Test");//测试是否传递请求头
        System.out.println(herderId);
        Map<String,Object> map = new HashMap<String,Object>();
        PageInfo<User> pageInfo = userService.findUserByPage(pageNo,pageSize);//分页查询
        map.put("pageInfo",pageInfo);
        return map;
    }
 
}      
访问:http://localhost:9411/  会出现图形页面      

继续阅读