SpringCloud微服務(wù)框架
微服務(wù)SpringCloud架構(gòu)簡(jiǎn)介
微服務(wù)化的核心就是將傳統(tǒng)的一站式應(yīng)用,根據(jù)業(yè)務(wù)拆分成一個(gè)一個(gè)的服務(wù),徹底地去耦合,每個(gè)微服務(wù)提供單個(gè)的業(yè)務(wù)功能的服務(wù),一個(gè)服務(wù)做一件事情,從技術(shù)角度去看就是一種小而獨(dú)立的處理過(guò)程,類似進(jìn)程的概念,能夠自行單獨(dú)啟動(dòng)或者銷毀,擁有自己獨(dú)立的數(shù)據(jù)庫(kù)。
微服務(wù)與微服務(wù)架構(gòu)的理解
微服務(wù)是服務(wù)的大小,它關(guān)注的是某一個(gè)點(diǎn),是具體解決某一個(gè)問(wèn)題、提供落地對(duì)應(yīng)服務(wù)的一個(gè)服務(wù)應(yīng)用
微服務(wù)優(yōu)點(diǎn) 每個(gè)服務(wù)足夠內(nèi)聚,足夠小,代碼容易理解這樣能夠聚焦一個(gè)指定的業(yè)務(wù)功能或者業(yè)務(wù)需求開(kāi)發(fā)簡(jiǎn)單,開(kāi)發(fā)效率提供,一個(gè)服務(wù)可能就是專一的干一件事情。缺點(diǎn) 開(kāi)發(fā)人員要處理分布式的服務(wù)雜性 運(yùn)維難度大 部署依賴 通信成本大
架構(gòu)的相關(guān)組件
服務(wù)注冊(cè)與發(fā)現(xiàn)----配置中心管理
服務(wù)調(diào)用----服務(wù)網(wǎng)關(guān)
服務(wù)熔斷----服務(wù)監(jiān)控
負(fù)載均衡----全鏈路監(jiān)控
服務(wù)降級(jí)----自動(dòng)化部署監(jiān)控
服務(wù)消息隊(duì)列----服務(wù)定時(shí)任務(wù)操作
微服務(wù)技術(shù)棧 服務(wù)開(kāi)發(fā) 服務(wù)配置與管理 服務(wù)注冊(cè)與發(fā)現(xiàn) 服務(wù)調(diào)用 服務(wù)熔斷器 負(fù)載均衡 服務(wù)接口調(diào)用 消息隊(duì)列 服務(wù)配置中心管理 服務(wù)路由 API網(wǎng)關(guān) 服務(wù)監(jiān)控
Dubbo與SpringCloud對(duì)比 SpringCloud擁有完整的微服務(wù)架構(gòu),支持Rest Riibon支持多種可插的序列化選擇,不是RPC,支持多種語(yǔ)言,Eureka是服務(wù)注冊(cè),是負(fù)載均衡Ribbon+客戶端Zull Zull+服務(wù)動(dòng)態(tài)代理,配置服務(wù)config,是服務(wù)調(diào)用鏈監(jiān)控Zull,是高可用,容錯(cuò)Hystrix+客戶端Ribbon Dubbo擁有微服務(wù),不支持RESTFul,是RPC,不支持多種語(yǔ)言,是服務(wù)注冊(cè),是客戶端負(fù)載均衡,不是配置服務(wù)config 不是服務(wù)調(diào)用鏈監(jiān)控Zull,否
SpringCloud微服務(wù)概述 SpringClou是基于SpringBoot提供了一整套的微服務(wù),技術(shù)棧有服務(wù)注冊(cè)與發(fā)現(xiàn),服務(wù)配置中心,全鏈路監(jiān)控,服務(wù)網(wǎng)關(guān),負(fù)載均衡,熔斷器等組件 SpringCloud為開(kāi)發(fā)人員提供了一整套的分布式系統(tǒng),包括配置管理,服務(wù)發(fā)現(xiàn),斷路器,路喲,微代理,事件總線,全局索,決策競(jìng)選,分布式會(huì)話等
SpringClou與SpringBoot比較
Springcloud官方地址
創(chuàng)建microservicecloud父工程所依賴的架包
<packaging>pom</packaging>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<junit.version>4.12</junit.version>
<log4j.version>1.2.17</log4j.version>
<lombok.version>1.16.18</lombok.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Dalston.SR1</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>1.5.9.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.0.4</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.0.31</version>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.0</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
<version>1.2.3</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>${log4j.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
創(chuàng)建microservicecloud-api子模塊 創(chuàng)建microservicecloud-api子模塊的pom依賴的架包
<dependencies><!-- 當(dāng)前Module需要用到的jar包,按自己需求添加,如果父類已經(jīng)包含了,可以不用寫版本號(hào) -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
</dependencies>
創(chuàng)建實(shí)體類
package com.yang.entity;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
import java.io.Serializable;
@SuppressWarnings("serial")
@NoArgsConstructor
@Data
@Accessors(chain=true)
public class Dept implements Serializable {
private Long deptno; //主鍵
private String dname; //部門名稱
private String db_source;//來(lái)自那個(gè)數(shù)據(jù)庫(kù),因?yàn)槲⒎?wù)架構(gòu)可以一個(gè)服務(wù)對(duì)應(yīng)一個(gè)數(shù)據(jù)庫(kù),同一個(gè)信息被存儲(chǔ)到不同數(shù)據(jù)庫(kù)
public Dept(String dname)
{
super();
this.dname = dname;
}
}
創(chuàng)建microservicecloud-provider-dept-8001 服務(wù)提 供者 加載pom倉(cāng)庫(kù)庫(kù)依賴
<dependencies>
<dependency>
<groupId>com.yang</groupId>
<artifactId>microservicecloud-api</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jetty</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
<!-- 修改后立即生效,熱部署 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>springloaded</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency>
<dependency>
<groupId>com.yang</groupId>
<artifactId>microservicecloud-api</artifactId>
<version>1.0-SNAPSHOT</version>
<scope>compile</scope>
</dependency>
</dependencies>
創(chuàng)建application.yml配置文件
server:
port: 8001
mybatis:
config-location: classpath:mybatis/mybatis.cfg.xml # mybatis配置文件所在路徑
type-aliases-package: com.yang.entity # 所有Entity別名類所在包
mapper-locations:
- classpath:mybatis/mapper/**/*.xml # mapper映射文件
spring:
application:
name: microservicecloud-dept
datasource:
type: com.alibaba.druid.pool.DruidDataSource # 當(dāng)前數(shù)據(jù)源操作類型
driver-class-name: org.gjt.mm.mysql.Driver # mysql驅(qū)動(dòng)包
url: jdbc:mysql://localhost:3306/cloudDB01 # 數(shù)據(jù)庫(kù)名稱
username: root
password: root
dbcp2:
min-idle: 5 # 數(shù)據(jù)庫(kù)連接池的最小維持連接數(shù)
initial-size: 5 # 初始化連接數(shù)
max-total: 5 # 最大連接數(shù)
max-wait-millis: 200 # 等待連接獲取的最大超時(shí)時(shí)間
eureka:
client: #客戶端注冊(cè)進(jìn)eureka服務(wù)列表內(nèi)
service-url:
defaultZone: http://localhost:7001/eureka
# defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/
instance:
instance-id: microservicecloud-dept8001
prefer-ip-address: true #訪問(wèn)路徑可以顯示IP地址
info:
app.name: atguigu-microservicecloud
company.name: www.atguigu.com
build.artifactId: $project.artifactId$
build.version: $project.version$
創(chuàng)建mybatis.cfg.xml配置文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<settings>
<setting name="cacheEnabled" value="true" /><!-- 二級(jí)緩存開(kāi)啟 -->
</settings>
</configuration>
創(chuàng)建deptMapper配置文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.yang.dao.DeptDao">
<select id="findById" resultType="Dept" parameterType="Long">
select deptno,dname,db_source from dept where deptno=#{deptno};
</select>
<select id="findAll" resultType="Dept">
select deptno,dname,db_source from dept;
</select>
<insert id="addDept" parameterType="Dept">
INSERT INTO dept(dname,db_source) VALUES(#{dname},DATABASE());
</insert>
</mapper>
創(chuàng)建DeptDao層
package com.yang.dao;
import com.yang.entity.Dept;
import org.apache.ibatis.annotations.Mapper;
import java.util.List;
@Mapper
public interface DeptDao {
public boolean addDept(Dept dept);
public Dept findById(Long id);
public List<Dept> findAll();
}
創(chuàng)建service接口
package com.yang.service;
import com.yang.entity.Dept;
import java.util.List;
public interface DeptService {
public boolean add(Dept dept);
public Dept get(Long id);
public List<Dept> list();
}
service的實(shí)現(xiàn)接口impl
package com.yang.service.impl;
import com.yang.dao.DeptDao;
import com.yang.entity.Dept;
import com.yang.service.DeptService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class DeptServiceImpl implements DeptService {
@Autowired
private DeptDao dao ;
@Override
public boolean add(Dept dept)
{
return dao.addDept(dept);
}
@Override
public Dept get(Long id)
{
return dao.findById(id);
}
@Override
public List<Dept> list()
{
return dao.findAll();
}
}
編寫controller層
package com.yang.controler;
import com.yang.entity.Dept;
import com.yang.service.DeptService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@RestController
public class DeptController {
@Autowired
private DeptService service;
@RequestMapping(value="/dept/add",method= RequestMethod.POST)
public boolean add(@RequestBody Dept dept)
{
return service.add(dept);
}
@RequestMapping(value="/dept/get/{id}",method=RequestMethod.GET)
public Dept get(@PathVariable("id") Long id)
{
return service.get(id);
}
@RequestMapping(value="/dept/list",method=RequestMethod.GET)
public List<Dept> list()
{
return service.list();
}
}
創(chuàng)建microservicecloud-customer-dept-8080 消費(fèi)者
加載pom依賴
<dependencies>
<dependency>
<groupId>com.yang</groupId>
<artifactId>microservicecloud-api</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- 修改后立即生效,熱部署 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>springloaded</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency>
</dependencies>
創(chuàng)建配置類
RestTemplate
「RestTemplate」提供了多種便捷訪問(wèn)遠(yuǎn)程Http服務(wù)的方法, 是一種簡(jiǎn)單便捷的訪問(wèn)restful服務(wù)模板類,是Spring提供的用于訪問(wèn)Rest服務(wù)的客戶端模板工具集,官網(wǎng)地址:https://docs.spring.io/spring-framework/docs/4.3.7.RELEASE/javadoc-api/org/springframework/web/client/RestTemplate.html,使用restTemplate訪問(wèn)restful接口非常的簡(jiǎn)單粗暴無(wú)腦。(url, requestMap, ResponseBean.class)這三個(gè)參數(shù)分別代表 REST請(qǐng)求地址、請(qǐng)求參數(shù)、HTTP響應(yīng)轉(zhuǎn)換被轉(zhuǎn)換成的對(duì)象類型。
package com.yang.springcloud.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;
@Configuration
public class ConfigBean
{
@Bean
public RestTemplate getRestTemplate()
{
return new RestTemplate();
}
}
創(chuàng)建controller層
package com.yang.springcloud.controller;
import com.yang.entity.Dept;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
import java.util.List;
@RestController
public class DeptController_Consumer {
private static final String REST_URL_PREFIX = "http://localhost:8001";
@Autowired
private RestTemplate restTemplate;
@RequestMapping(value="/consumer/dept/add")
public boolean add(Dept dept)
{
return restTemplate.postForObject(REST_URL_PREFIX+"/dept/add", dept, Boolean.class);
}
@RequestMapping(value="/consumer/dept/get/{id}")
public Dept get(@PathVariable("id") Long id)
{
return restTemplate.getForObject(REST_URL_PREFIX+"/dept/get/"+id, Dept.class);
}
@SuppressWarnings("unchecked")
@RequestMapping(value="/consumer/dept/list")
public List<Dept> list()
{
return restTemplate.getForObject(REST_URL_PREFIX+"/dept/list", List.class);
}
}
創(chuàng)建啟動(dòng)類
package com.yang.springcloud;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class DeptConsumer80_App
{
public static void main(String[] args)
{
SpringApplication.run(DeptConsumer80_App.class, args);
}
}
