1

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

image-20210227154842598

如果是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)

DQuery
300 声望93 粉丝

幸福是奋斗出来的


引用和评论

0 条评论