1.使用阿里云服务器搭建完成美团cat,启动cat
账号密码都是admin

2.本地启动cat-demo服务


CatContext.java
public class CatContext implements Cat.Context{
/**
* 链路监控信息
*/ private Map<String, String > properties = new HashMap<>();
@Override
public void addProperty(String key ,String value){
properties.put(key,value);
}
@Override
public String getProperty(String key) {
return properties.get(key);
}
CatFilterConfigure.java
public class CatFilterConfigure {
@Bean
public FilterRegistrationBean catFilter() {
FilterRegistrationBean registration = new FilterRegistrationBean();
CatServletFilter filter = new CatServletFilter();
registration.setFilter(filter);
registration.addUrlPatterns("/*");
registration.setName("cat-filter");
registration.setOrder(1);
return registration;
}
}
CatHttpConstants.java
public class CatHttpConstants {
public static final String CAT_HTTP_HEADER_CHILD_MESSAGE_ID = "X-CAT-CHILD-ID";
public static final String CAT_HTTP_HEADER_PARENT_MESSAGE_ID = "X-CAT-PARENT-ID";
public static final String CAT_HTTP_ Header _ROOT_MESSAGE_ID = "X-CAT-ROOT-ID";
}
CatRestInterceptor.java
@Component
public class CatRestInterceptor implements ClientHttp Request Interceptor {
@Override
public ClientHttpResponse intercept(HttpRequest request, byte [] body, ClientHttpRequestExecution execution)
throws IO Exception {
Transaction t = Cat.newTransaction(CatConstants.TYPE_REMOTE_CALL, request.getURI().toString());
try {
HttpHeaders headers = request.getHeaders();
// 保存和传递CAT调用链上下文
Cat.Context ctx = new CatContext();
Cat.logRemoteCallClient(ctx);
headers.add(CatHttpConstants.CAT_HTTP_HEADER_ROOT_MESSAGE_ID, ctx.getProperty(Cat.Context.ROOT));
headers.add(CatHttpConstants.CAT_HTTP_HEADER_PARENT_MESSAGE_ID, ctx.getProperty(Cat.Context.PARENT));
headers.add(CatHttpConstants.CAT_HTTP_HEADER_CHILD_MESSAGE_ID, ctx.getProperty(Cat.Context.CHILD));
// 继续执行请求
ClientHttpResponse response = execution.execute(request, body);
t.setStatus(Transaction.SUCCESS);
return response;
} catch (Exception e) {
Cat.getProducer().logError(e);
t.setStatus(e);
throw e;
} finally {
t.complete();
}
}
}
CatServletFilter.java
public class CatServletFilter implements Filter {
private String[] urlPatterns = new String[0];
/**
* 初始化配置
* @param filterConfig
* @throws ServletException
*/ @Override
public void init(FilterConfig filterConfig) throws ServletException {
String patterns = filterConfig.getInitParameter("CatHttpModuleUrlPatterns");
if (patterns != null) {
patterns = patterns.trim();
urlPatterns = patterns.split(",");
for (int i = 0; i < urlPatterns.length; i++) {
urlPatterns[i] = urlPatterns[i].trim();
}
}
}
/**
* 请求过滤处理
* @param servletRequest
* @param servletResponse
* @param filterChain
* @throws IOException
* @throws ServletException
*/ @Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) servletRequest;
String url = request.getRequestURL().toString();
for (String urlPattern : urlPatterns) {
if (url.startsWith(urlPattern)) {
url = urlPattern;
}
}
// cat 上下文信息设置
CatContext catContext = new CatContext();
catContext.addProperty(Cat.Context.ROOT, request.getHeader(CatHttpConstants.CAT_HTTP_HEADER_ROOT_MESSAGE_ID));
catContext.addProperty(Cat.Context.PARENT, request.getHeader(CatHttpConstants.CAT_HTTP_HEADER_PARENT_MESSAGE_ID));
catContext.addProperty(Cat.Context.CHILD, request.getHeader(CatHttpConstants.CAT_HTTP_HEADER_CHILD_MESSAGE_ID));
Cat.logRemoteCallServer(catContext);
Transaction t = Cat.newTransaction(CatConstants.TYPE_URL, url);
try {
// cat日志记录
Cat.logEvent("Service.method", request.getMethod(), Message.SUCCESS, request.getRequestURL().toString());
Cat.logEvent("Service.client", request.getRemoteHost());
filterChain.doFilter(servletRequest, servletResponse);
t.setStatus(Transaction.SUCCESS);
} catch (Exception ex) {
t.setStatus(ex);
Cat.logError(ex);
throw ex;
} finally {
t.complete();
}
}
}
(启动类) CatDemoGatewayApplication.java
package com.itcast.bulls.stock.cat.demo.gateway.startup;
import com.dianping.cat.Cat;
import com.dianping.cat.CatConstants;
import com.dianping.cat.message.Transaction;
import com.itcast.bulls.stock.cat.demo.gateway.catutils.CatRestInterceptor;
import org.springframework.beans.factory. annotation .Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot. Spring Application;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
import java .util.Collections;
@SpringBootApplication
@EnableDiscoveryClient
@ComponentScan(basePackages = {"com.itcast"})
@RestController
public class CatDemoGatewayApplication {
@Autowired
private RestTemplate restTemplate;
@Value("${service2.address:localhost:8082}")
private String serviceAddress;
public static void main(String[] args) {
SpringApplication.run(CatDemoGatewayApplication.class,args);
}
@RequestMapping("/gateway")
public String gateway() throws Exception{
Thread.sleep(100);
String response = restTemplate.getForObject("#34;+serviceAddress + "/order",String.class);
return "gateway response=>" + response;
}
/**
* 模拟请求异常
* @return
* @throws Exception
*/ @RequestMapping("/timeout")
public String timeout() throws Exception{
Transaction t = Cat.newTransaction(CatConstants.TYPE_URL,"timeout");
try{
Thread.sleep(100);
String response = restTemplate.getForObject("#34; + serviceAddress + "/timeout",String.class);
return response;
}catch (Exception e){
Cat.getProducer().logError(e);
t.setStatus(e);
throw e;
}finally {
t.complete();
}
}
@Bean
RestTemplate restTemplate() {
RestTemplate restTemplate = new RestTemplate();
// 保存和传递调用链上下文
restTemplate.setInterceptors(Collections.singletonList(new CatRestInterceptor()));
return restTemplate;
}
}
其他几个服务配置一样。
本地配置D:dataappdatascatclient.xml
<?xml version="1.0" encoding="utf-8"?>
<config mode="client">
<servers>
<server ip="106.14.250.251" port="2280" http-port="8080" enabled="true"/>
</servers>
</config>
3.调用接口


4.问题
Log View点击显示错误
Sorry, the message is not there. It could be missing or archived.
问题待解决