一个简单的微服务
参考:《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可移步官网查看