SpingCloud:springboot微服务集成ribbon+mybatis实现增删查(三)

前言

在前面博客学习微服务的注册和发现基础下,集成mybatis完成增删查操作自然水到渠成,由三个基础服务就可以完成,分别是服务注册中心服务提供者服务消费者

一、创建服务注册中心(spring-eureka-server)
因为前面博客详细的创建方法,这里不细说了,我直接引用前面博客创建的服务,我使用eureka01(9001) 端口的服务注册中心,并贴上一些关键代码。
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>spring-cloud</artifactId>
        <groupId>spring-cloud</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>spring-eureka-server</artifactId>
    <version>0.0.1-SNAPSHOT</version>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-eureka-server</artifactId>
        </dependency>
    </dependencies>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Dalston.SR3</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

application.properties

spring.application.name=spring-eureka-server
server.port=9001

eureka.instance.hostname=eureka01
eureka.client.register-with-eureka=false
eureka.client.fetch-registry=false
eureka.client.serviceUrl.defaultZone=http://localhost:9001/eureka

二、创建服务提供者(spring-eureka-provide)
(1)先引入springboot集成mybatis、mysql等依赖,pom.xml完整依赖如下
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>spring-cloud</artifactId>
        <groupId>spring-cloud</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>spring-eureka-provide</artifactId>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
    </properties>
    <dependencies>
        <!-- 服务提供 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-eureka</artifactId>
        </dependency>

        <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>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.1.8</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>

        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>1.3.1</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>1.3.1</version>
        </dependency>

        <!-- spring boot actuator 监控信息 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
    </dependencies>
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Dalston.SR3</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

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

application.properties重点:配置数据库连接信息
说明:
(1)spring.application.name设置的名字为服务消费者调用的Url
(2)#db为连接数据库配置信息
(3)info为该端口具体信息

spring.application.name=spring-eureka-provide
server.port=7001
eureka.client.serviceUrl.defaultZone=http://localhost:9001/eureka/
eureka.instance.instance-id=provide7001
eureka.instance.prefer-ip-address=true

#db
spring.datasource.url=jdbc:mysql://localhost:3306/springcloud?useUnicode=true&characterEncoding=utf-8
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.driver-class-name=com.mysql.jdbc.Driver


# Specify the DBMS
spring.jpa.database = MYSQL
# Show or not log for each sql query
spring.jpa.show-sql = true

info.author.name=zdxh
info.app.name=microservice-provide
info..server.port=${server.port}
info.application.name=${spring.application.name}

(2)创建User实体类,编写controller、service、mapper层逻辑代码
SpingCloud:springboot微服务集成ribbon+mybatis实现增删查(三)
User.java

package eureka.provide.entity;

public class User {
    private Integer id;
    private String username;
    private String password;
}
//省略get、set方法

UserController.java`
说明:
@component (把普通pojo实例化到spring容器中)

package eureka.provide.controller;

import eureka.provide.entity.User;
import eureka.provide.service.Userservice;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;

@RestController
@Component
public class UserController {

    @Autowired
    Userservice userservice;

    @GetMapping("/find/{id}")
    public User findByIdUser(@PathVariable("id")Integer id){
        User user=userservice.findUser(id);
        return user;
    }

    @GetMapping("/del/{id}")
    public String delUser(@PathVariable("id") Integer id) {
        int num =userservice.delUser(id);
        return num == 1 ? "success" : "error";
    }

    @GetMapping("/save/{uname}/{pword}")
    public String saveUser(@PathVariable("uname") String username, @PathVariable("pword") String password) {
       User user=new User();
       user.setUsername(username);
       user.setPassword(password);
       int num=userservice.saveUser(user);
       return num == 1? "success": "error";
    }
}

UserSerice.java接口

package eureka.provide.service;
import eureka.provide.entity.User;
public interface Userservice {
    User findUser(Integer id);
    int saveUser(User user);
    int delUser(Integer id);
}

UserServiceImpl.java

package eureka.provide.service.impl;

import eureka.provide.entity.User;
import eureka.provide.mapper.UserMapper;
import eureka.provide.service.Userservice;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class UserServiceImpl implements Userservice {

    @Autowired
    UserMapper userMapper;
   //根据id查询用户
    public User findUser(Integer id){
        return this.userMapper.findUser(id);
    }
  //保存用户
    public int saveUser(User user){
        this.userMapper.saveUser(user);
        return 1;
    }
   //删除用户
    public int delUser(Integer id){
        this.userMapper.delUser(id);
        return 1;
    }
}

UserMapper接口
这里引用@Select,@Insert注解方式,所以不需要配置UserMapper.xml文件

package eureka.provide.mapper;

import eureka.provide.entity.User;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Select;

public interface UserMapper {

    @Select("select * from user where id = #{id}")
    User findUser(Integer id);

    @Insert("insert into user(username,password) values(#{username},#{password})")
    void saveUser(User user);

    @Select("delete from user where id = #{id}")
    void delUser(Integer id);
}

主函数启动类EuerkaProvideApplication
新增@MapperScan注解
@MapperScan:可以指定要扫描的Mapper类的包的路径

package eureka.provide;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;

@EnableEurekaClient
@SpringBootApplication
@MapperScan("eureka.provide.mapper")
public class EurekaProvideApplication {

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

三、服务消费者(spring-eureka-consume)
pom.xml
(1)新增ribbon负载均衡依赖包

<?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>spring-cloud</artifactId>
        <groupId>spring-cloud</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>spring-eureka-consume</artifactId>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <!-- 服务提供 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-eureka</artifactId>
        </dependency>
        <!-- 提供web服务 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!-- 负载均衡 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-ribbon</artifactId>
        </dependency>
    </dependencies>
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Dalston.SR3</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

application.properties

spring.application.name=spring-eureka-consume
server.port=8001
eureka.client.serviceUrl.defaultZone=http://localhost:9001/eureka/

(2)然后在主函数创建ResTemplate类

package eureka.consume;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;

@EnableEurekaClient
@SpringBootApplication
public class EurekaConsumeApplication {

    @Bean
    @LoadBalanced
    RestTemplate restTemplate(){
        return new RestTemplate();
    }
    public static void main(String[] args){
        SpringApplication.run(EurekaConsumeApplication.class,args);
    }
}

(3)最后新建User实体类和和UserController.java
User.java

package eureka.consume.entity;

public class User {
    private Integer id;
    private String username;
    private String password;
    }
    //省略get、set方法

UserController.java

package eureka.consume.controller;

import eureka.consume.entity.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.client.RestTemplate;

@Controller
@Configuration
public class UserController {

    @Autowired
    private RestTemplate restTemplate;

    @GetMapping("/find/{id}")
    @ResponseBody
    public User find(@PathVariable("id")Integer id){
        return restTemplate.getForEntity("http://spring-eureka-provide/find/{id}",User.class,id).getBody();
    }

    @GetMapping(value = "/del/{id}")
    @ResponseBody
    public String del(@PathVariable("id") Integer id) {
        return restTemplate.getForEntity("http://spring-eureka-provide/del/{id}", String.class,id).getBody();
    }

    @GetMapping(value = "/save/{username}/{password}")
    @ResponseBody
    public String save(@PathVariable("username") String username, @PathVariable("password") String password) {
        return restTemplate
                .getForEntity("http://spring-eureka-provide/save/{username}/{password}", String.class, username, password)
                .getBody();
    }
}

四、启动各服务测试
(1)先创建数据库springcloud创建user表如下
SpingCloud:springboot微服务集成ribbon+mybatis实现增删查(三)
(2)分别启动各服务,输入localhost:9001,查看各服务是否成功启动
SpingCloud:springboot微服务集成ribbon+mybatis实现增删查(三)
(3)输入localhost:8001/find/1,消费者调用提供者find方法,查询ID=1的用户信息
SpingCloud:springboot微服务集成ribbon+mybatis实现增删查(三)
再测试一下保存用户信息
SpingCloud:springboot微服务集成ribbon+mybatis实现增删查(三)
四、实现负载均衡
再新建一个spring-eureka-provide2,代码配置与provide完成一样,只需要修改端口号。
application.properties
注意:spring.application.name与第一个provide名字要相同

spring.application.name=spring-eureka-provide
server.port=7002
eureka.client.serviceUrl.defaultZone=http://localhost:9001/eureka/
eureka.instance.instance-id=provide7002
eureka.instance.prefer-ip-address=true

然后分别在两个provide的Controller新建TestController,测试负载均衡。

package eureka.provide.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class TestController {

    @GetMapping("/test")
    public String test(){
        return "provide1";
    }
}
package eureka.provide.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class TestController {

    @GetMapping("/test")
    public String test(){
        return "provide2";
    }
}

最后,启动provide2,查看服务
SpingCloud:springboot微服务集成ribbon+mybatis实现增删查(三)
输入localhost:8001/test,测试负载均衡,刷新页面,页面会在provide1和provide2之间跳转
SpingCloud:springboot微服务集成ribbon+mybatis实现增删查(三)
SpingCloud:springboot微服务集成ribbon+mybatis实现增删查(三)

总结

路是一步步走出来的,与大家共勉,有不解之处可评论指出。

`