【微服务笔记(三)】之使用SpringBoot搭建服务提供与服务消费工程

本文章由公号【开发小鸽】发布!欢迎关注!!!


老规矩–妹妹镇楼:

一.服务提供方实例

(一). 创建项目工程

        创建微服务父工程SpringCloudParentDemo,用户服务提供工程SpringCloudProducer,服务消费工程SpringCloudConsumer。后面两个工程继承父工程,父工程添加Spring Boot父坐标和管理其他组件的依赖;用户服务工程用于整合Mybatis查询数据库中用户数据,提供查询用户数据服务;服务消费工程用于调用查询用户服务数据并输出到浏览器。

(二) 配置父工程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.SpringCloud</groupId>
    <artifactId>com.SpringCloud.ParentDemo</artifactId>
    <packaging>pom</packaging>
    <version>1.0-SNAPSHOT</version>
    <modules>
        <module>SpringCloudConsumer</module>
        <module>SpringCloudProducer</module>
    </modules>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.5.RELEASE</version>
        <relativePath/>
    </parent>

    <properties>
        <java.version>1.8</java.version>
        <spring-cloud.version>Greenwich.SR1</spring-cloud.version>
        <mapper.starter.version>2.1.5</mapper.starter.version>
        <mysql.version>5.1.46</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>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-config</artifactId>
            </dependency>
        </dependencies>
    </dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.16.0</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

        modules标签内表示的是该父工程中子工程的名称;

        parent标签内继承了SpringBoot启动器依赖;

        properties标签内表示的是其他配置信息,如java版本,SpringCloud版本,mybatis版本,mysql驱动版本,后面可以直接引用这些版本信息。

        dependencyManagement标签内表示的是依赖的坐标管理,只是限定我们需要依赖的坐标,但是并没有真正地导入这些坐标。真正地导入坐标需要在每个子工程中自行导入。

        由于spring-cloud-dependencies依赖的scope是import,因此只要包括了该依赖的项目都能够继承该工程中的依赖,因此父工程项目不仅继承了spring-boot-parent,还继承了spring-cloud-dependencies,不需要自己再定义SpringCloud组件的版本了。


(三)配置服务提供子工程的pom.xml

        由于父工程中已经配置了依赖的坐标管理,因此,我们直接在子工程导入已经管理的坐标即可,如Mapper启动器,mysql驱动,不需要定义版本。同时还有web启动器。

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <!-- 通用Mapper启动器 -->
    <dependency>
        <groupId>tk.mybatis</groupId>
        <artifactId>mapper-spring-boot-starter</artifactId>
    </dependency>
    <!-- mysql驱动 -->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
    </dependency>
</dependencies>

(四)创建引导类和SpringBoot配置文件appliaction.yml

        创建引导类入口:

@SpringBootApplication
public class userApplication {
    public static void main(String[] args) {
        SpringApplication.run(userApplication.class, args);
    }
}

        配置application.yml,其中包括服务器的端口号,使用数据源的驱动,地址,用户名,密码,同时还有设置mybatis别名包的扫描,这个包和包中的实体类需要自行创建。

server:
  port: 9091
spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/springcloud
    username:root
    password:

mybatis:
  type-aliases-package: com.user.pojo

        创建实体类User:

package com.user.pojo;

import lombok.Data;
import tk.mybatis.mapper.annotation.KeySql;

import javax.persistence.Id;
import javax.persistence.Table;
import java.util.Date;

@Data
@Table(name = "tb_user")
public class User{
    // id
    @Id
    //开启主键自动回填
    @KeySql(useGeneratedKeys = true)
    private Long id;

    // 用户名
    private String userName;

    // 密码
    private String password;

    // 姓名
    private String name;

    // 年龄
    private Integer age;

    // 性别,1男性,2女性
    private Integer sex;

    // 出生日期
    private Date birthday;

    // 创建时间
    private Date created;

    // 更新时间
    private Date updated;

    // 备注
    private String note;
}

(五)创建数据表

        根据需求创建数据表。

(六)创建Mapper接口

        Mapper接口继承Mapper接口,并且要传入参数User对象。

package com.user.mapper;

import com.user.pojo.User;
import tk.mybatis.mapper.common.Mapper;

public interface UserMapper extends Mapper<User> {
}

        同时需要将该Mapper接口的全包名设置到引导类的注解@MapperScan的参数上面,用来扫描到这个Mapper包。

(七) 创建service层的类

        创建service层的类来调用Mapper的方法,查询用户User的数据。本次使用的是Mapper中固有的方法,通过主键查询,而不是自定义的UserMapper类中的方法。

package com.user.service;

import com.user.mapper.UserMapper;
import com.user.pojo.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class UserService {

    @Autowired
    private UserMapper userMapper;

    public User queryById(Long id){
        return userMapper.selectByPrimaryKey(id);
    }
}

(八).创建controller层的类

        创建UserController调用userService类的queryById方法,该方法的参数通过请求的地址中的id值来获取。

        @RestController是@Controller和@Responsebody的结合,代表着直接返回一个json字符串到页面上,而不是view;

        @GetMapping 表示着这是一个Get请求方法的@RequestMapping注解;

        @PathVariable 表示着从地址中取出某个参数;

@RestController
@RequestMapping("/user")
public class UserController {
    @Autowired
    private UserService userService;

    @GetMapping("/{id}")
    public User queryById(@PathVariable Long id){
        return userService.queryById(id);
    }
}

(九)测试代码运行情况

        通过引导类运行Spring程序,访问localhost:8080/user/9将数据库根据id=9索引出来的数据显示在页面上。

二.服务消费方实例

(一) 需求

        微服务消费方的需求是访问localhost:8081/consumer/8 使用RestTemplate获取localhost:8080/user/8的数据。

(二)配置pom.xml

        继承之前创建的父工程SpringCloudParentDemo,然后再添加一个web的启动依赖。

<?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>com.SpringCloud.ParentDemo</artifactId>
        <groupId>com.SpringCloud</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>SpringCloudConsumer</artifactId>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    </dependencies>

</project>

(三)创建引导类和配置文件

        创建一个引导类,同时需要在引导类中提前注册一个RestTemplate,以供调用。

@SpringBootApplication
public class ConsumerApp {
    public static void main(String[] args) {
        SpringApplication.run(ConsumerApp.class, args);
    }

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

(四)创建Controller

        添加一个Controller,其中有函数queryBuId()通过RestTemplate将微服务提供的服务数据截取过来,返回一个User对象,这个User对象与服务提供方的User对象是一样的。注意,User对象一定要设置get和set方法,不然会出错。

@RestController
@RequestMapping("/consumer")
public class ConsumerController {
    @Autowired
    private RestTemplate restTemplate;

    public User queryBuId(Long id){
        String url = "http://localhost:8081/user/8";
        return restTemplate.getForObject(url, User.class);
    }
}

(五)测试微服务消费方

        启动引导类,访问localhost:8081/consumer/8,就会得到微服务提供方获取的数据库的数据,并显示在页面上。


三.总结项目的问题

(一)服务管理

        1. 服务如何自动注册和发现。

        2. 如何实现状态监管,服务提供方的状态和服务消费方的状态都是需要监测。

        3. 如何实现动态路由。

(二)负载均衡

        当有多个服务器运行时,如何实现服务的负载均衡。


(三)容灾问题

        当有服务器宕机时,如何解决容灾问题。

(四)服务统一配置问题

        若有多个服务器,如何对多个服务器进行统一的配置。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值