1.创建父工程
工程信息:<groupId>com.keyi.demo</groupId><artifactId>cloud-demo</artifactId><version>1.0-SNAPSHOT</version>
具体pom.xml
<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.keyi.demo</groupId><artifactId>cloud-demo</artifactId><version>1.0.0-SNAPSHOT</version><modules><module>user-service</module><module>consumer-demo</module></modules><packaging>pom</packaging><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.0.4.RELEASE</version><relativePath/></parent><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding><java.version>1.8</java.version><spring-cloud.version>Finchley.SR1</spring-cloud.version><mapper.starter.version>2.0.3</mapper.starter.version><mysql.version>5.1.32</mysql.version></properties><dependencyManagement><dependencies><!-- springCloud依赖管理 --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>${spring-cloud.version}</version><type>pom</type><scope>import</scope></dependency><!-- 通用Mapper启动器 --><dependency><groupId>tk.mybatis</groupId><artifactId>mapper-spring-boot-starter</artifactId><version>${mapper.starter.version}</version></dependency><!-- mysql驱动 --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>${mysql.version}</version></dependency></dependencies></dependencyManagement><dependencies><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build></project>
2.创建子模块
2.1 服务提供方user-service
具体pom.xml
<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><parent><artifactId>cloud-demo</artifactId><groupId>com.keyi.demo</groupId><version>1.0.0-SNAPSHOT</version></parent><modelVersion>4.0.0</modelVersion><artifactId>user-service</artifactId><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><scope>runtime</scope></dependency><dependency><groupId>tk.mybatis</groupId><artifactId>mapper-spring-boot-starter</artifactId></dependency></dependencies></project>
yml
server:port: 8081spring:datasource:url: jdbc:mysql://localhost:3306/clouddb01username: rootpassword: 123456hikari:maximum-pool-size: 20minimum-idle: 10mybatis:type-aliases-package: com.keyi.user.pojo
类
// 实体类@Table(name = "tb_user")@Datapublic class User implements Serializable {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Long id;private String userName; // 用户名private String password; // 密码private String name; // 姓名private Integer age; // 年龄private Integer sex; // 性别,1男性,2女性private Date birthday; // 出生日期private Date created; // 创建时间private Date updated; // 更新时间private String note; // 备注}// mapperpublic interface UserMapper extends Mapper<User> {}// service@Servicepublic class UserService {@Autowiredprivate UserMapper userMapper;public User queryById(Long id) {return this.userMapper.selectByPrimaryKey(id);}}// controller@RestController@RequestMapping("user")public class UserController {@Autowiredprivate UserService userService;@GetMapping("/{id}")public User queryById(@PathVariable("id") Long id) {return this.userService.queryById(id);}}// 启动器@SpringBootApplication@MapperScan("com.keyi.user.mapper")public class UserApplication {public static void main(String[] args) {SpringApplication.run(UserApplication.class, args);}}
2.2 服务消费端consumer-demo
<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><parent><artifactId>cloud-demo</artifactId><groupId>com.keyi.demo</groupId><version>1.0.0-SNAPSHOT</version></parent><modelVersion>4.0.0</modelVersion><artifactId>consumer-demo</artifactId><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency></dependencies></project>
@Datapublic class User {private Long id;private String userName; // 用户名private String password; // 密码private String name; // 姓名private Integer age; // 年龄private Integer sex; // 性别,1男性,2女性private Date birthday; // 出生日期private Date created; // 创建时间private Date updated; // 更新时间private String note; // 备注}@RestController@RequestMapping("consumer")public class ConsumerController {@Autowiredprivate RestTemplate restTemplate;@GetMapping("{id}")public User queryById(@PathVariable("id") Long id) {String url = "http://localhost:8081/user/" + id;return this.restTemplate.getForObject(url, User.class);}}@SpringBootApplicationpublic class ConsumerApplication {@Beanpublic RestTemplate restTemplate() {// 这次我们使用了OkHttp客户端,只需要注入工厂即可return new RestTemplate();}public static void main(String[] args) {SpringApplication.run(ConsumerApplication.class, args);}}
3.总结
user-service: 一个提供根据id查询用户的微服务
consumer-demo: 一个服务调用者,通过RestTemplate远程调用user-service
大致流程:
存在问题:
● 在consumer中,我们把url地址硬编码到了代码中,不方便后期维护
● consumer需要记忆user-service的地址,如果出现变更,可能得不到通知,地址将失效
● consumer不清楚user-service的状态,服务宕机也不知道
● user-service只有1台服务,不具备高可用性
● 即便user-service形成集群,consumer还需自己实现负载均衡
上面所述问题,也就是分布式服务必然要面临的问题:
● 服务管理
- 如何自动注册和发现
- 如何实现状态监管
- 如何实现动态路由
● 服务如何实现负载均衡
● 服务如何解决容灾问题
● 服务如何实现统一配置
