SpringCloud 微服务架构——服务提供与服务消费

工欲善其事,必先利其器,本系列文章均在 STS 这个 IDE 下进行,该工具的下载地址见STS;
JDK 选择 JDK1.8;
项目构建工具 Maven3

在进行整个架设之前我们需要考虑的是,一个提供服务的微服务和一个消费这个服务的微服务,我们以电影售票的案例为演示。
电影售票

用户向电影微服务发起购票请求,而购票服务得先去查询用户信息,这里用户微服务相当于服务提供者,电影微服务相当于服务调用者。
首先构建这两个微服务;

服务提供者

构建用户微服务

项目构建

1、创建一个Spring Starter 项目


创建一个Spring Starter 项目

2、配置基本环境


配置基本环境

3、增加依赖
增加依赖

这里增加主要的几个依赖,其他的可以后续在 pom 中增加

修改一些

修改 src/main/resources下的application.propertiesapplication.yml

application.yml 配置文件里面,首先修改服务端口为8000

pom 中增加druid依赖包


        
            com.alibaba
            druid
            1.0.18
        

把包先构建好,这里暂时包括controller,mapper,servlet,filter,model,mapper

启动类的基本配置

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.ServletComponentScan;

@SpringBootApplication
@ServletComponentScan   //扫描Servlet  
@MapperScan("cn.ts.ms.user.mapper")
public class MsSimpleProviderUserApplication {

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

数据库装备工作

构建一个 ebook 数据库,里面建立一个 USER

数据库里面增加一条数据


Druid 数据源配置

首先在 application.yml 里面配置相关链接等信息,注意缩进

spring:
    datasource:
        name: ebook
        url: jdbc:mysql://localhost:3306/ebook
        username: root
        password: root
        # 使用druid数据源
        type: com.alibaba.druid.pool.DruidDataSource
        driver-class-name: com.mysql.jdbc.Driver
        filters: stat
        maxActive: 20
        initialSize: 1
        maxWait: 60000
        minIdle: 1
        timeBetweenEvictionRunsMillis: 60000
        minEvictableIdleTimeMillis: 300000
        validationQuery: select 'x'
        testWhileIdle: true
        testOnBorrow: false
        testOnReturn: false
        poolPreparedStatements: true
        maxOpenPreparedStatements: 20

构建DruidDataSourceConfiguration配置类,来配置 Druid 构建的数据源

package cn.ts.ms.user;
import javax.sql.DataSource;  
import org.springframework.boot.context.properties.ConfigurationProperties;  
import org.springframework.context.annotation.Bean;  
import org.springframework.context.annotation.Configuration;  
  
import com.alibaba.druid.pool.DruidDataSource;  
@Configuration  
public class DruidDataSourceConfiguration {  
  
    @Bean  
    @ConfigurationProperties(prefix = "spring.datasource")  
    public DataSource druidDataSource() {  
        DruidDataSource druidDataSource = new DruidDataSource();  
        return druidDataSource;  
    }  
}  

数据访问相关类

有了数据源,就需要 Model 来承载
构建 User 对象

package cn.ts.ms.user.model;

import java.io.Serializable;
import java.util.Date;

public class User implements Serializable{

    private static final long serialVersionUID = 1L;
    private Integer id;
    private String name;
    private String password;
    private String nickName;
    private Date lastLoginDt;
    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    public String getNickName() {
        return nickName;
    }
    public void setNickName(String nickName) {
        this.nickName = nickName;
    }
    public Date getLastLoginDt() {
        return lastLoginDt;
    }
    public void setLastLoginDt(Date lastLoginDt) {
        this.lastLoginDt = lastLoginDt;
    }
    
}

有了模型对象,就可以对对象进行 CRUD 操作,接下来构建 Mapper 接口,该接口必须放置在启动类的 MapperScan 标注的包里面,也就是cn.ts.ms.user.mapper

package cn.ts.ms.user.mapper;

import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;

import cn.ts.ms.user.model.User;

public interface UserMapper {

    @Select("select * from user where id = #{id}")  
    User findUserById(@Param("id") String id);  
}

服务层和控制层

这里为了方面省略了服务层,直接在控制层调用 Mapper

package cn.ts.ms.user.controller;

import javax.annotation.Resource;

import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import cn.ts.ms.user.mapper.UserMapper;
import cn.ts.ms.user.model.User;

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

    @Resource  
    private UserMapper userMapper;  
     
    @RequestMapping("/find")  
    public User findUserById(@RequestParam String id){  
        return userMapper.findUserById(id);  
    } 
}

启动服务和测试

好了,有了上面的基本操作,我们可以启动服务来看看效果
项目名称上右键,如图操作


或者

我们来到浏览器输入http://localhost:8000/user/find?id=1

由于没有在 SQL 里面做映射,导致有两个字段为 null
修改 mapper 的 sql 为@Select("select id,name,password,nick_name as nickName,last_login_dt as lastLoginDt from user where id = #{id}")
然后重启服务,在浏览结果为

扩展

Druid 我们还可以进行配置他的监控,收需要做个过滤器,把我们需要监控的纳入进来

package cn.ts.ms.user.filter;

import javax.servlet.annotation.WebFilter;
import javax.servlet.annotation.WebInitParam;

import com.alibaba.druid.support.http.WebStatFilter;

@WebFilter(filterName = "druidWebStatFilter", urlPatterns = "/*", initParams = {
        @WebInitParam(name = "exclusions", value = "*.js,*.gif,*.jpg,*.bmp,*.png,*.css,*.ico,/druid/*")// 忽略资源
})
public class DruidStatFilter extends WebStatFilter {

}

然后建立一个 servlet,这个 servlet如下

package cn.ts.ms.user.filter;
import com.alibaba.druid.support.http.StatViewServlet;  
import javax.servlet.annotation.WebServlet;  
import javax.servlet.annotation.WebInitParam;  
@WebServlet(urlPatterns = "/druid/*",   
    initParams={  
            @WebInitParam(name="allow",value="127.0.0.1"),// IP白名单 (没有配置或者为空,则允许所有访问)  
            @WebInitParam(name="deny",value="192.168.16.111"),// IP黑名单 (存在共同时,deny优先于allow)  
            @WebInitParam(name="loginUsername",value="admin"),// 用户名  
            @WebInitParam(name="loginPassword",value="123"),// 密码  
            @WebInitParam(name="resetEnable",value="false")// 禁用HTML页面上的“Reset All”功能  
    })  
public class DruidStatViewServlet extends StatViewServlet {  
    private static final long serialVersionUID = 1L;  
      
} 

在浏览器输入http://localhost:8000/druid
会出现一个登录框,输入用户名和密码,在DruidStatViewServlet里面有配置


于是就进入到 Druid 的控制页面

我们利用 Druid 可以查看如下各个信息,非常强大

至此我们的微服务提供端就开发好了,当然这里只是一个简易演示,实际生产环境会有更多配置

你可能感兴趣的:(SpringCloud 微服务架构——服务提供与服务消费)