1.创建父工程

  1. 工程信息:
  2. <groupId>com.keyi.demo</groupId>
  3. <artifactId>cloud-demo</artifactId>
  4. <version>1.0-SNAPSHOT</version>

具体pom.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  5. <modelVersion>4.0.0</modelVersion>
  6. <groupId>com.keyi.demo</groupId>
  7. <artifactId>cloud-demo</artifactId>
  8. <version>1.0.0-SNAPSHOT</version>
  9. <modules>
  10. <module>user-service</module>
  11. <module>consumer-demo</module>
  12. </modules>
  13. <packaging>pom</packaging>
  14. <parent>
  15. <groupId>org.springframework.boot</groupId>
  16. <artifactId>spring-boot-starter-parent</artifactId>
  17. <version>2.0.4.RELEASE</version>
  18. <relativePath/>
  19. </parent>
  20. <properties>
  21. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  22. <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
  23. <java.version>1.8</java.version>
  24. <spring-cloud.version>Finchley.SR1</spring-cloud.version>
  25. <mapper.starter.version>2.0.3</mapper.starter.version>
  26. <mysql.version>5.1.32</mysql.version>
  27. </properties>
  28. <dependencyManagement>
  29. <dependencies>
  30. <!-- springCloud依赖管理 -->
  31. <dependency>
  32. <groupId>org.springframework.cloud</groupId>
  33. <artifactId>spring-cloud-dependencies</artifactId>
  34. <version>${spring-cloud.version}</version>
  35. <type>pom</type>
  36. <scope>import</scope>
  37. </dependency>
  38. <!-- 通用Mapper启动器 -->
  39. <dependency>
  40. <groupId>tk.mybatis</groupId>
  41. <artifactId>mapper-spring-boot-starter</artifactId>
  42. <version>${mapper.starter.version}</version>
  43. </dependency>
  44. <!-- mysql驱动 -->
  45. <dependency>
  46. <groupId>mysql</groupId>
  47. <artifactId>mysql-connector-java</artifactId>
  48. <version>${mysql.version}</version>
  49. </dependency>
  50. </dependencies>
  51. </dependencyManagement>
  52. <dependencies>
  53. <dependency>
  54. <groupId>org.projectlombok</groupId>
  55. <artifactId>lombok</artifactId>
  56. </dependency>
  57. </dependencies>
  58. <build>
  59. <plugins>
  60. <plugin>
  61. <groupId>org.springframework.boot</groupId>
  62. <artifactId>spring-boot-maven-plugin</artifactId>
  63. </plugin>
  64. </plugins>
  65. </build>
  66. </project>

2.创建子模块

2.1 服务提供方user-service

具体pom.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  5. <parent>
  6. <artifactId>cloud-demo</artifactId>
  7. <groupId>com.keyi.demo</groupId>
  8. <version>1.0.0-SNAPSHOT</version>
  9. </parent>
  10. <modelVersion>4.0.0</modelVersion>
  11. <artifactId>user-service</artifactId>
  12. <dependencies>
  13. <dependency>
  14. <groupId>org.springframework.boot</groupId>
  15. <artifactId>spring-boot-starter-web</artifactId>
  16. </dependency>
  17. <dependency>
  18. <groupId>mysql</groupId>
  19. <artifactId>mysql-connector-java</artifactId>
  20. <scope>runtime</scope>
  21. </dependency>
  22. <dependency>
  23. <groupId>tk.mybatis</groupId>
  24. <artifactId>mapper-spring-boot-starter</artifactId>
  25. </dependency>
  26. </dependencies>
  27. </project>

yml

  1. server:
  2. port: 8081
  3. spring:
  4. datasource:
  5. url: jdbc:mysql://localhost:3306/clouddb01
  6. username: root
  7. password: 123456
  8. hikari:
  9. maximum-pool-size: 20
  10. minimum-idle: 10
  11. mybatis:
  12. type-aliases-package: com.keyi.user.pojo

  1. // 实体类
  2. @Table(name = "tb_user")
  3. @Data
  4. public class User implements Serializable {
  5. @Id
  6. @GeneratedValue(strategy = GenerationType.IDENTITY)
  7. private Long id;
  8. private String userName; // 用户名
  9. private String password; // 密码
  10. private String name; // 姓名
  11. private Integer age; // 年龄
  12. private Integer sex; // 性别,1男性,2女性
  13. private Date birthday; // 出生日期
  14. private Date created; // 创建时间
  15. private Date updated; // 更新时间
  16. private String note; // 备注
  17. }
  18. // mapper
  19. public interface UserMapper extends Mapper<User> {}
  20. // service
  21. @Service
  22. public class UserService {
  23. @Autowired
  24. private UserMapper userMapper;
  25. public User queryById(Long id) {
  26. return this.userMapper.selectByPrimaryKey(id);
  27. }
  28. }
  29. // controller
  30. @RestController
  31. @RequestMapping("user")
  32. public class UserController {
  33. @Autowired
  34. private UserService userService;
  35. @GetMapping("/{id}")
  36. public User queryById(@PathVariable("id") Long id) {
  37. return this.userService.queryById(id);
  38. }
  39. }
  40. // 启动器
  41. @SpringBootApplication
  42. @MapperScan("com.keyi.user.mapper")
  43. public class UserApplication {
  44. public static void main(String[] args) {
  45. SpringApplication.run(UserApplication.class, args);
  46. }
  47. }

启动效果
01 微服务场景模拟入门 - 图1

2.2 服务消费端consumer-demo

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  5. <parent>
  6. <artifactId>cloud-demo</artifactId>
  7. <groupId>com.keyi.demo</groupId>
  8. <version>1.0.0-SNAPSHOT</version>
  9. </parent>
  10. <modelVersion>4.0.0</modelVersion>
  11. <artifactId>consumer-demo</artifactId>
  12. <dependencies>
  13. <dependency>
  14. <groupId>org.springframework.boot</groupId>
  15. <artifactId>spring-boot-starter-web</artifactId>
  16. </dependency>
  17. </dependencies>
  18. </project>
  1. @Data
  2. public class User {
  3. private Long id;
  4. private String userName; // 用户名
  5. private String password; // 密码
  6. private String name; // 姓名
  7. private Integer age; // 年龄
  8. private Integer sex; // 性别,1男性,2女性
  9. private Date birthday; // 出生日期
  10. private Date created; // 创建时间
  11. private Date updated; // 更新时间
  12. private String note; // 备注
  13. }
  14. @RestController
  15. @RequestMapping("consumer")
  16. public class ConsumerController {
  17. @Autowired
  18. private RestTemplate restTemplate;
  19. @GetMapping("{id}")
  20. public User queryById(@PathVariable("id") Long id) {
  21. String url = "http://localhost:8081/user/" + id;
  22. return this.restTemplate.getForObject(url, User.class);
  23. }
  24. }
  25. @SpringBootApplication
  26. public class ConsumerApplication {
  27. @Bean
  28. public RestTemplate restTemplate() {
  29. // 这次我们使用了OkHttp客户端,只需要注入工厂即可
  30. return new RestTemplate();
  31. }
  32. public static void main(String[] args) {
  33. SpringApplication.run(ConsumerApplication.class, args);
  34. }
  35. }

启动
01 微服务场景模拟入门 - 图2

3.总结

user-service: 一个提供根据id查询用户的微服务
consumer-demo: 一个服务调用者,通过RestTemplate远程调用user-service
大致流程:
01 微服务场景模拟入门 - 图3
存在问题:
● 在consumer中,我们把url地址硬编码到了代码中,不方便后期维护
● consumer需要记忆user-service的地址,如果出现变更,可能得不到通知,地址将失效
● consumer不清楚user-service的状态,服务宕机也不知道
● user-service只有1台服务,不具备高可用性
● 即便user-service形成集群,consumer还需自己实现负载均衡
上面所述问题,也就是分布式服务必然要面临的问题:
● 服务管理

  • 如何自动注册和发现
  • 如何实现状态监管
  • 如何实现动态路由

● 服务如何实现负载均衡
● 服务如何解决容灾问题
● 服务如何实现统一配置