SpringCloud【1】初体验之RestTemplate

这篇文章对微服务的初步了解有一点点帮助。如下图:
在这里插入图片描述
要实现微服务project1和微服务2之间调用服务和提供服务的通信。这里有一个父工程,是用来进行版本控制的。因为springboot和springcloud的版本有一定的对应关系,如果有很多个微服务,可能会有版本冲突的问题,所以采用父工程集中管理的方案。

下面的实验,会进行这样的模拟:
project2需要project1提供根据id获得用户信息的服务,project1则字project2 调用时提供响应的服务。
说白了就是两个微服务间的简单互动,来吧!开始吧!

创建父工程

  1. 创建maven工程
    在这里插入图片描述在这里插入图片描述
  2. 在pom.xml中导入依赖
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.6.RELEASE</version>
    </parent>
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Greenwich.SR1</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

创建子工程

提供服务的project1

这个部分主要是做springboot整合jpa,实现从数据库中获取用户信息的功能。

  1. 创建project1工程

    project1就是我们之前常写的,dao-service-controller老一套。
    在这里插入图片描述在这里插入图片描述
    (这里创建完毕以后到父工程的pom文件可以看到以下代码)

	<modules>
        <module>project1</module>
    </modules>
  1. 添加依赖(注意是新建的这个子工程的pom文件)
	<dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <!--JPA-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>

        <!--MySQL驱动-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>

    </dependencies>

这里的jpa类似于mybatis持久层框架,下面会对它进行介绍,以及简单使用。

  1. 在数据库中创建表,并连接数据库
    老演员了…
    在这里插入图片描述
-- ----------------------------
-- Table structure for user
-- ----------------------------
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
  `id` int(2) NOT NULL,
  `name` varchar(5) NOT NULL,
  `age` int(3) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of user
-- ----------------------------
INSERT INTO `user` VALUES ('1', '小红', '5');
INSERT INTO `user` VALUES ('2', '小蓝', '12');
INSERT INTO `user` VALUES ('3', '小绿', '99');

在resource文件夹下application.yml文件中进行端口号数据库配置

server:
  port: 8080
spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    username: root
    password: root
    #test数据库名
    url: jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC
  1. 项目目录如下,千篇一律的dao-service-controller
    在这里插入图片描述
  2. User类:
@Entity
@Table(name = "user")
public class User implements Serializable {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;

    private String name;

    private Integer age;

   //以下省略getter、setter
}

@Table(name = "user")是让数据库表和创建的这个实体类进行User,name属性和数据库表名要一样。
@Id标识主键
@GeneratedValue(strategy = GenerationType.IDENTITY)标识主键的自增方式,IDENTITY说明是自动自增1

  1. UserDao接口
public interface UserDao extends JpaRepository<User,Integer> {
}

这里extends JpaRepository<User,Integer>,JpaReposity包含了对数据库的一般操作,User是实体类,Integer是主键数据类型。

  1. UserService接口
public interface UserService {
    //根据id返回用户信息
    User findByUserId(Integer id);
}

findByUserId是jpa自己有的,敲代码会有提示

  1. UserService实现类
@Service
public class UserServiceImpl implements UserService {
    @Autowired
    UserDao userDao;

    @Override
    public User findByUserId(Integer id) {
        return userDao.findById(id).get();
    }
}

注意到这里和MyBatis有些不一样,userDao.findById(id).get(),这里有个.get() !!不要忘了

  1. UserController
@RestController
@RequestMapping("/user")
public class UserController {

    @Autowired
    UserService userService;

    @RequestMapping("/find/{id}")
    public User findById(@PathVariable Integer id){
        return userService.findByUserId(id);
    }
}
  1. Project1Application启动类
@SpringBootApplication
public class Project1Application {
    public static void main(String[] args) {
        SpringApplication.run(Project1Application.class,args);
    }
}
  1. 运行启动类,浏览器访问:http://localhost:8080/user/find/1 ,得到以下结果,说明结果说明project1提供服务的功能没问题了。接下里就是project2!
    在这里插入图片描述

需要服务的project2

project2需要调用project1根据id查询用户信息的这一个服务。话不多说!开干!

  1. 创建工程
    和project1一样,选中parent-project,新建model
    在这里插入图片描述
    整个项目结构是这样的:
    在这里插入图片描述
  2. 添加依赖
<dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    </dependencies>
  1. 目录
    在这里插入图片描述

  2. 实体类User

public class User {
    private Integer id;
    private String name;
    private Integer age;

    //以下省略getterr、setter
}
  1. resource文件夹下新建application.yml文件,设置下端口号。
    因为是微服务,所以project1,project2是运行在不同服务器上的,所以端口号会不一样。
server:
  port: 8081
  1. 启动类Project2Application,这里解释下下面这段代码。
@SpringBootApplication
public class Project2Application {
    public static void main(String[] args) {
        SpringApplication.run(Project2Application.class,args);
    }

    @Bean
    public RestTemplate restTemplate(){
        return new RestTemplate();
    }
}

关于RestTemplate:用Restful风格进行过开发的更容易理解,没用过的话就项先简单理解为一个模拟发起请求的东东,继续往下看就知道了。这里先注册一下,让spring进行管理。

  1. UserController
@RestController
public class UserController {

    @Autowired
    private RestTemplate restTemplate;

    @GetMapping("/{id}")
    public User queryById(@PathVariable Integer id){
        String url = "http://localhost:8080/user/find/"+id;
        return restTemplate.getForObject(url,User.class);
    }
}

project2是要调用project1的服务,所以这个controller是用来发起请求的。
从下面的代码来体会下RestTemplate的用法。

在启动类的时候注册了RestTemplate,在这里就可以自动注入了。代码中的url变量是project1的访问地址。
getForObject(url,User.class),会获取到project1服务器给出的User信息,并自动转成user对象返回。行不行看结果,下一步!

  1. 运行启动类!浏览器访问:http://localhost:8081/2 ,结果如下!成功啦!

在这里插入图片描述

关于RestTemplate

关于RestTemplate

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值