HelloWorld
我们先做一个最简单的spring boot hello world的应用
@RestController
public class HelloController {
@GetMapping("/helloworld")
public String helloWorld() {
return "hello world";
}
}
在浏览器访问http://localhost:port/helloword
后登录skywalking查看结果
- 拓扑图显示了服务之间的调用关系,目前该应用未调用任何服务,因此只有
用户->应用
的拓扑图
- 追踪展示每个服务的详细信息,并且图形化展示服务之间的调用链,这个对于排查复杂接口是非常有用,可以通过调用链查看每个服务的调用信息,也会记录每个服务的耗时情况,对于排查性能问题非常有帮助
点开服务可以查看服务的详细信息
信息面板根据服务类型不一样展示的数据也不一样
jdbc
我们给代码加上数据库操作,这里方便演示在代码上就不做分层
@RestController
public class HelloController {
@Autowired
private JdbcTemplate jdbcTemplate;
@GetMapping("/jdbc")
public Map helloWorld() {
return jdbcTemplate.queryForMap("select * from apm_project limit 1");
}
}
需要在application.properties中提前配置好数据源连接信息
点开可以查看具体sql
如果是sql带参数,默认是不显示参数
如果需要开启sql参数显示,修改agent.config
将参数plugin.mysql.trace_sql_parameters
设置为true
plugin.mysql.trace_sql_parameters=${SW_MYSQL_TRACE_SQL_PARAMETERS:true}
活着在启动参数中加入-Dskywalking.plugin.mysql.trace_sql_parameters=true
8.4.0以后参数变为 plugin.jdbc.trace_sql_parameters
Feign
微服务开发中,服务启动需要在注册中心进行注册,调用方通过服务发现从注册中心获取服务信息然后通过Feign进行调用,这里包含两个应用
- 服务提供方
- 服务调用方
这里以一个简单的userService
为例,注册中心使用Nacos
服务提供方
- 配置文件
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
spring.application.name=userService
- 服务接口
@RestController
@RequestMapping("user")
public class UserController {
@NacosInjected
private NamingService namingService;
@RequestMapping(value = "/detail", method = GET)
@ResponseBody
public User getUser(String userName) {
User user = new User();
user.setUserName(userName);
user.setEmail(userName + "@definesys.com");
user.setId("id:" + userName);
return user;
}
@RequestMapping(value = "/add", method = POST)
@ResponseBody
public User addUser(@RequestBody User user) {
user.setId("id:" + user.getUserName());
return user;
}
}
服务调用方
- 配置文件
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
spring.application.name=serviceConsumer
- FeignClient
@FeignClient("userService")
@Component
public interface UserService {
@GetMapping(value = "/user/detail")
User getUser(@RequestParam(value = "userName") String userName);
@RequestMapping(value = "/user/add",method = POST)
User newUser(User user);
}
- Controller
@RestController
public class UserConsumerController {
@Autowired
private UserService service;
@RequestMapping(value = "fetUser")
public User test(@RequestParam("userName") String userName) {
return service.getUser(userName);
}
@PostMapping(value = "newUser")
public User newUser(@RequestBody User newUser) {
return service.newUser(newUser);
}
}
从图中我们可以看到有三个span
- {POST}/newUser:对外接口,从span信息可以得知,接口请求分方式为POST,接口url为http://localhost:8083/newUser
- Balancer/user/add:Feign调用
- /user/add:userService服务,也就是服务提供者的调用信息
从Skywalking上可以清楚的看到整个服务的调用链路,包括链路中每个节点的详细信息,在这个例子中,POST请求默认是不记录body信息,设置以下参数可以开启Feign调用body参数记录
plugin.feign.collect_request_body=true
Skywalking目前不支持外部接口POST body记录,具体原因可以参考这里
Feign和Nacos集成碰到一些问题
- 不同命名空间服务无法互相调用(spring.cloud.nacos.discovery.namespace)
- 不同分组间服务无法互相调用(spring.cloud.nacos.discovery.group)