微服務(wù)
個人理解:
所謂微服務(wù)是指每個模塊都可以獨立完成自己的核心業(yè)務(wù),某一個模塊的崩潰不影響其他模塊的運行,
每個微服務(wù)有自己單獨的一個數(shù)據(jù)庫
每一個微小的服務(wù)組成了一個復(fù)雜的軟件系統(tǒng)
微服務(wù)架構(gòu)
微服務(wù)指的是服務(wù)的大小,關(guān)注的是完成一個具體的服務(wù)(醫(yī)院的科室)
微服務(wù)架構(gòu)是一種架構(gòu)模式 ,它提倡將單一應(yīng)用程序劃分成一組小的服務(wù),服務(wù)之間互相協(xié)調(diào)、互相
配合,為用戶提供最終價值。一種將一個單一應(yīng)用程序開發(fā)為一組小型服務(wù)的方法,每個服務(wù)都在其運行
的進程中。(整個醫(yī)院)
優(yōu)點:
- 針對特定服務(wù)發(fā)布,影響小,風(fēng)險小,成本低
- 頻繁發(fā)布版本,快速交付需求
- 低成本擴容,彈性伸縮,適應(yīng)云環(huán)境
SpringCould簡介
Springboot關(guān)注于更快的開發(fā)單體的微服務(wù),而SpringCloud關(guān)注于全局服務(wù)的治理
Spring Cloud 是一系列框架的有序集合,它利用 Spring Boot 的開發(fā)便利性巧妙地簡化了分布式系統(tǒng)基礎(chǔ)設(shè)施的開發(fā),如服務(wù)發(fā)現(xiàn)注冊、配置中心、消息總線、負載均衡、斷路器、數(shù)據(jù)監(jiān)控等,都可以用 Spring Boot 的開發(fā)風(fēng)格做到一鍵啟動和部署。
Spring 并沒有重復(fù)制造輪子,它只是將目前各家公司開發(fā)的比較成熟、經(jīng)得起實際考驗的服務(wù)框架組合起來,通過 Spring Boot 風(fēng)格進行再封裝、屏蔽掉了復(fù)雜的配置和實現(xiàn)原理,最終給開發(fā)者留出了一套簡單易懂、易部署和易維護的分布式系統(tǒng)開發(fā)工具包。
環(huán)境搭建
在idea中新建一個maven父工程在其pom配置對應(yīng)依賴,以管理子類依賴的版本
<properties>
<lombock.version>1.18.18</lombock.version>
<log4j.version>1.2.17</log4j.version>
</properties>
<dependencyManagement>
<dependencies>
<!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-netflix-eureka-client -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
<version>3.0.2</version>
</dependency>
<!--spring cloud 依賴包-->
<!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-dependencies -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Hoxton.SR9</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!--spring boot 依賴包-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.3.5.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!--數(shù)據(jù)庫驅(qū)動-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.22</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.21</version>
</dependency>
<!--springboot 啟動器-->
<!-- <dependency>-->
<!-- <groupId>org.springframework.boot</groupId>-->
<!-- <artifactId>spring-boot-starter</artifactId>-->
<!-- <version>2.4.4</version>-->
<!-- </dependency>-->
<!--JUnit-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13</version>
<scope>test</scope>
</dependency>
<!--lombock-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombock.version}</version>
<scope>import</scope>
</dependency>
<!--log4j-->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>${log4j.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
1. 創(chuàng)建數(shù)據(jù)庫
創(chuàng)建名為db01的數(shù)據(jù)庫,有一張表dept
2. 新建一個子模塊api
其中只有一個實體類dept對應(yīng)我們數(shù)據(jù)庫中的表
public class Dept {
private int deptnumber;
private String dname;
private String d_source;
//對應(yīng)屬性的get和set方法
}
3. 新建一個子模塊provider作為服務(wù)的提供者
導(dǎo)入依賴
<dependencies>
<!--將api模塊導(dǎo)入由此可使用Dept實體類-->
<dependency>
<groupId>org.example</groupId>
<artifactId>springcloud-api</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.1</version>
</dependency>
</dependencies>
配置配置文件和對應(yīng)的操作類和接口
application.xml
server:
port: 8081
mybatis:
type-aliases-package: pojo
mapper-locations: classpath:Mybatis/mapper/*.xml
config-location: classpath:Mybatis/mybatis-config.xml
spring:
application:
name: provider-name
datasource:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
username: root
password: 123456
url: jdbc:mysql://localhost:3306/db01?useSSL=false&serverTimezone=UTC&useUnicode=true&characterEncoding=UTF-8
mapper-config.xml和Deptmapper.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"/>
</settings>
</configuration>
<?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.Dao.DeptDao">
<insert id="add" parameterType="Dept">
insert into dept(dname, d_source) values (#{dname},DATABASE());
</insert>
<select id="queryByID" resultType="Dept" parameterType="Long">
select * from dept where deptnumber = #{id};
</select>
<select id="queryAll" resultType="Dept">
select * from dept;
</select>
</mapper>
對應(yīng)的Dao,Controller,Service
@Mapper
public interface DeptDao {
boolean add(Dept dept);
Dept queryByID(long id);
List<Dept> queryAll();
}
@Service
public class DeptImpl implements DeptService{
@Resource
private DeptDao deptDao;
public boolean add(Dept dept) {
return deptDao.add(dept) ;
}
public Dept queryByID(long id) {
System.out.println("deptimpl"+id);
return deptDao.queryByID(id);
}
public List<Dept> queryAll() {
return deptDao.queryAll();
}
}
@RestController
public class DeptController {
@Autowired
private DeptImpl deptimpl;
@PostMapping("/dev/add")
public boolean addDept(@RequestBody Dept dept){
System.out.println(dept);
return deptimpl.add(dept);
}
@GetMapping("/dev/{id}")
public Dept DeptqueryByID(@PathVariable("id") long id) {
System.out.println("deptcontroller"+id);
return deptimpl.queryByID(id);
}
@PostMapping("/dev/list")
public List<Dept> DeptqueryAll() {
return deptimpl.queryAll();
}
啟動類
@SpringBootApplication
public class SApplication {
public static void main(String[] args) {
SpringApplication.run(SApplication.class,args);
}
}
新建子模塊consumer作為消費者
導(dǎo)入依賴
<dependencies>
<dependency>
<groupId>org.example</groupId>
<artifactId>springcloud-api</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
配置文件
server:
port: 80
config類和controller
/*
RestTemplate 是從 Spring3.0 開始支持的一個 HTTP 請求工具,它提供了常見的REST請求方案的模版,例
如 GET 請求、POST 請求、PUT 請求、DELETE 請求以及一些通用的請求執(zhí)行方法 exchange 以及 execute。
*/
@Configuration
public class ConfigBean {
@Bean
public RestTemplate getRestTemplate() {
return new RestTemplate();
}
}
@RestController public class ConsumerController { @Autowired private RestTemplate template; private static final String url="http://localhost:8001"; @RequestMapping("/consumer/get/{id}") public Dept getByID(@PathVariable long id){ //請求的路徑,請求返回的對象 Dept getEntity = template.getForObject(url + "/dev/" + id, Dept.class); return getEntity; } @RequestMapping("/consumer/add") public boolean add(String dname){ Dept dept = new Dept(); dept.setDname(dname); System.out.println(dept); //請求的路徑,傳遞的參數(shù),返回的對象 return template.postForObject(url+ "/dev/add",dept,Boolean.class); } @RequestMapping("/consumer/list") public List<Dept> list(){ //請求的路徑,返回的對象 return template.postForObject(url+"/dev/list",void.class,List.class); } }
啟動類及運行結(jié)果
debug-connect refuserd---debug-傳參為null
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class,args);
}
}
debug
子項目無法使用父項目的依賴包
1 如果父項目pom使用
<dependencyManagement>
<dependencies>
....
</dependencies>
</dependencyManagement>
方式,則子項目pom不會自動使用父pom中的jar包, 如果需要使用,就要給出groupId和artifactId,無需給出version
使用是為了統(tǒng)一管理版本信息
在子工程中使用時,還是需要引入坐標的,但是不需要給出version
在我們項目頂層的POM文件中,元素。
通過它元素來管理jar包的版本,
讓子項目中引用一個依賴而不用顯示的列出版本號。
Maven會沿著父子層次向上找,
直到找到一個擁有dependencyManagement元素的項目,
然后它就會使用在這個dependencyManagement元素中指定的版本號。
required a bean of type 'DeptDao' that could not be found.
使用@Mapper而不是@Repository
1、使用@mapper后,不需要在spring配置中設(shè)置掃描地址,通過mapper.xml里面的namespace屬性對應(yīng)相關(guān)的mapper類,spring將動態(tài)的生成Bean后注入到ServiceImpl中。
2、@repository則需要在Spring中配置掃描包地址,然后生成dao層的bean,之后被注入到ServiceImpl中
Connection refused connect
檢查url端口號,是否寫對,是否占用
RestTemplate傳遞對象無法接收(null)
在服務(wù)器端對應(yīng)的參數(shù)上添加@RequestBody
@PostMapping("/dev/add")
public boolean addDept(@RequestBody Dept dept){
System.out.println(dept);
return deptimpl.add(dept);
}
以上就是 SpringCloud微服務(wù)框架搭建實驗環(huán)境詳細步驟的全部內(nèi)容,想要了解更多關(guān)于 SpringCloud 微服務(wù)框架的其他資料請關(guān)注W3Cschool其它相關(guān)文章!也希望大家能夠多多支持!