在进行整个架设之前我们需要考虑的是,一个提供服务的微服务和一个消费这个服务的微服务,我们以电影售票的案例为演示。工欲善其事,必先利其器,本系列文章均在 STS 这个 IDE 下进行,该工具的下载地址见STS;
JDK 选择 JDK1.8;
项目构建工具 Maven3
用户向电影微服务发起购票请求,而购票服务得先去查询用户信息,这里用户微服务相当于服务提供者,电影微服务相当于服务调用者。
首先构建这两个微服务;
服务提供者
构建用户微服务
项目构建
1、创建一个Spring Starter 项目
2、配置基本环境
3、增加依赖
这里增加主要的几个依赖,其他的可以后续在 pom 中增加
修改一些
修改 src/main/resources
下的application.properties
为 application.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 可以查看如下各个信息,非常强大
至此我们的微服务提供端就开发好了,当然这里只是一个简易演示,实际生产环境会有更多配置