一个简单的微服务

Source

一个简单的微服务

参考:《Srping Cloud与Docker微服务架构实战 周立著》

微服务示例

微服务构建的是分布式系统,微服务间通过网络进行通信。微服务中使用服务消费者与服务提供者来描述微服务之间的关系

  • 服务提供者:服务的被调用方
  • 服务消费者:服务的调用方
    这里使用书中的例子“电影售票系统为例”编写一个简单的微服务系统。

服务架构

在这里插入图片描述
实现一个简单的功能,电影微服务从用户微服务中查询用户信息

  • 服务提供者:micro-user-service
  • 服务消费者:micro-movie-service
    在这里插入图片描述

编写服务提供者

项目的创建和基础结构可以参照前面的SpringBoot基础部分

  • 配置文件application.yml
server:
  port: 8881
spring:
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource
    url: jdbc:mysql://127.0.0.1:3306/micro_user?useUnicode=true&characterEncoding=utf-8&useSSL=true
    username : root
    password : xda265856
    driverClassName : com.mysql.jdbc.Driver
  jpa:
    hibernate:
      naming:
        physical-strategy: org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
      ddl-auto: update
    show-sql: true
  • 创建实体类ServiceUser.java

import javax.persistence.*;

@Entity
@Table(name = "tb_user")
public class ServiceUser {
    //设置主键并且设置主键为自增
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "user_id")
    private long userId;
    @Column(name = "user_name")
    private String username;
    @Column(name = "user_password")
    private String password;
    @Column(name = "student_age")
    private int age;
    //getter and setter
}
  • DAO.java
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
import org.virtue.pojo.ServiceUser;
@Repository
public interface UserRepository extends JpaRepository<ServiceUser, Long> {
}

  • Controller:UserController.java
@Controller
public class UserController {
    @Autowired
    private UserRepository userRepository;
    @ResponseBody
    @RequestMapping(value = "/users", method = {RequestMethod.GET})
    public List<ServiceUser> showUsers(){
        List<ServiceUser> students = userRepository.findAll();
        return students;
    }
}
  • 创建一个名为"micro-user-service"的数据库
  • 启动项目,数据库表会自动创建,插入几条测试数据,使用postman访问http://127.0.0.1:8881/users可看到如下数据:
    在这里插入图片描述

编写服务消费者

  • 添加实体类

public class ServiceUser {
    private long userId;
    private String username;
    private String password;
    private int age;
   //getter and setter
}
  • 添加Controller

  • 直接使用下面的方式可能会报错
 @Controller
public class MovieController {
    @Autowired
    private RestTemplate restTemplate;

    @ResponseBody
    @RequestMapping(value = "/movie/users", method = {RequestMethod.GET})
    public List<ServiceUser> listUsers(){
       return this.restTemplate.getForObject("http://127.0.0.1:8881/users",List.class);
    }
}

报错信息

Description:

Field restTemplate in org.virtue.controller.MovieController required a bean of type 'org.springframework.web.client.RestTemplate' that could not be found.

The injection point has the following annotations:
	- @org.springframework.beans.factory.annotation.Autowired(required=true)


Action:

Consider defining a bean of type 'org.springframework.web.client.RestTemplate' in your configuration.
@Controller
public class MovieController {
    //
    @Bean
    RestTemplate loadBalancedRestTemplate() {
        return new RestTemplate();
    }
    @Autowired
    private RestTemplate restTemplate;

    @ResponseBody
    @RequestMapping(value = "/movie/users", method = {RequestMethod.GET})
    public List<ServiceUser> listUsers(){
       return this.restTemplate.getForObject("http://127.0.0.1:8881/users",List.class);
    }
}
  • 使用postman进行测试,我们访问电影微服务。电影微服务调用用户微服务,返回我们需要的信息:
    在这里插入图片描述

整合Spring Boot Actuator

  • 介绍
    Spring Boot Actuator可以帮助你监控和管理Spring Boot应用,比如健康检查、审计、统计和HTTP追踪等。所有的这些特性可以通过JMX或者HTTP endpoints来获得。
    Actuator同时还可以与外部应用监控系统整合,比如 Prometheus, Graphite, DataDog, Influx, Wavefront, New Relic等。这些系统提供了非常好的仪表盘、图标、分析和告警等功能,使得你可以通过统一的接口轻松的监控和管理你的应用。
    Actuator使用Micrometer来整合上面提到的外部应用监控系统。这使得只要通过非常小的配置就可以集成任何应用监控系统。
  • 官方地址:链接
  • build.gradle添加依赖
 compile("org.springframework.boot:spring-boot-starter-actuator")
  • 启动项目
  • 通过http://127.0.0.1:8880/actuator可访问所有的endpoints
    在这里插入图片描述
  • 查看健康状态http://127.0.0.1:8880/actuator/health
    在这里插入图片描述
    状态将是UP只要应用是健康的。如果应用不健康将会显示DOWN,比如与仪表盘的连接异常或者缺水磁盘空间等。下一节我们将学习spring boot如何决定应用的健康和如何修复这些健康问题。
  • 其他的endpoint可移步官网查看