首先,我们需要模拟一个服务调用的场景。方便后面学习微服务架构
一、创建父工程
微服务中需要同时创建多个项目,为了方便课堂演示,先创建一个父工程,然后后续的工程都以这个工程为父,实现 maven的聚合。这样可以在一个窗口看到所有工程,方便讲解。在实际开发中,每个微服务可独立一个工程。
编写项目信息:
编写保存位置:
然后将 pom.xml 修改成如下(请从 资料\heima-springcloud.xml 文件中复制):
这里已经对大部分要用到的依赖的版本进行了 管理,方便后续使用
二、服务提供者
新建一个项目user-service,对外提供查询用户的服务。
步骤:
1、创建module
2、添加依赖
3、编写配置文件
4、编写代码
5、启动并测试
1、创建module
实现:
1、创建module
选中父工程:heima-springcloud
填写module信息:
注意,子模块要在父工程的下级目录:
2、添加依赖
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>heima-springcloud</artifactId> <groupId>com.itheima</groupId> <version>1.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <groupId>com.itheima</groupId> <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> </dependency> <dependency> <groupId>tk.mybatis</groupId> <artifactId>mapper-spring-boot-starter</artifactId> </dependency> </dependencies> </project>
项目结构:
3、编写配置文件
创建 user-service\src\main\resources\application.yml 属性文件,这里我们采用了yaml语法,而不是 properties:
server: port: 9091 spring: datasource: driver-class-name: com.mysql.jdbc.Driver url: jdbc:mysql://localhost:3306/springcloud username: root password: root mybatis: type-aliases-package: com.itheima.user.pojo
使用mysql图形界面工具创建 springcloud 数据库,将 资料\tb_user.sql 导入;
4、编写代码
编写 user-service\src\main\java\com\itheima\user\UserApplication.java 启动类:
package com.itheima.user; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import tk.mybatis.spring.annotation.MapperScan; @SpringBootApplication @MapperScan("com.itheima.user.mapper") public class UserApplication { public static void main(String[] args) { SpringApplication.run(UserApplication.class, args); } }
编写 user-service\src\main\java\com\itheima\user\pojo\User.java 实体类:
package com.itheima.user.pojo; import lombok.Data; import tk.mybatis.mapper.annotation.KeySql; import javax.persistence.Id; import javax.persistence.Table; import java.util.Date; @Table(name = "tb_user") @Data public class User { @Id @KeySql(useGeneratedKeys = true) 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;// 备注 }
编写 user-service\src\main\java\com\itheima\user\mapper\UserMapper.java
package com.itheima.user.mapper; import com.itheima.user.pojo.User; import tk.mybatis.mapper.common.Mapper; public interface UserMapper extends Mapper<User> { }
编写 user-service\src\main\java\com\itheima\user\service\UserService.java
添加一个对外查询的接口处理器 user-service\src\main\java\com\itheima\user\controller\UserController.java 创建完上述代码后项目结构:
5、启动并测试
启动 user-service 项目,访问接口:http://localhost:9091/user/8
三、服务调用者
1、创建工程
与上面类似,这里不再赘述,需要注意的是,我们调用user-service的功能,因此不需要mybatis相关依赖了。
pom.xml文件内容如下:
项目结构如下:
2、编写代码
编写启动类 consumer-demo\src\main\java\com\itheima\consumer\ConsumerApplication.java 并在其中注册RestTemplate 具体如下:
创建实体类 consumer-demo\src\main\java\com\itheima\consumer\pojo\User.java
编写consumer-demo\src\main\java\com\itheima\consumer\controller\ConsumerController.java,在controller中直接调用RestTemplate,远程访问user-service的服务接口:
服务调用者项目结构:
3、启动测试
启动 consumer-demo引导启动类;因为 consumer-demo 项目没有配置端口,那么默认就是8080,我们访问:http://localhost:8080/consumer/8
一个简单的远程服务调用案例就实现了。
四、思考问题
简单回顾一下,刚才我们写了什么: user-service:对外提供了查询用户的接口 consumer-demo:通过RestTemplate访问http://locahost:9091/user/{id}接口,查询用户数据存在什么问题?- 在consumer中,我们把url地址硬编码到了代码中,不方便后期维护
- consumer需要记忆user-service的地址,如果出现变更,可能得不到通知,地址将失效consumer不清楚user-service的状态,服务宕机也不知道
- user-service只有1台服务,不具备高可用性
- 即便user-service形成集群,consumer还需自己实现负载均衡
- 服务管理
-
- 如何自动注册和发现
- 如何实现状态监管
- 如何实现动态路由
- 服务如何实现负载均衡
- 服务如何解决容灾问题
- 服务如何实现统一配置
标签:服务,service,Spring,consumer,Cloud17,user,java,com,itheima From: https://www.cnblogs.com/ajing2018/p/18140545