SpringCloud入門實(shí)驗(yàn)環(huán)境搭建
微服務(wù)
個(gè)人理解:
所謂微服務(wù)是指每個(gè)模塊都可以獨(dú)立完成自己的核心業(yè)務(wù),某一個(gè)模塊的崩潰不影響其他模塊的運(yùn)行,
每個(gè)微服務(wù)有自己單獨(dú)的一個(gè)數(shù)據(jù)庫
每一個(gè)微小的服務(wù)組成了一個(gè)復(fù)雜的軟件系統(tǒng)
微服務(wù)架構(gòu)
微服務(wù)指的是服務(wù)的大小,關(guān)注的是完成一個(gè)具體的服務(wù)(醫(yī)院的科室)
微服務(wù)架構(gòu)是一種架構(gòu)模式 ,它提倡將單一應(yīng)用程序劃分成一組小的服務(wù),服務(wù)之間互相協(xié)調(diào)、互相
配合,為用戶提供最終價(jià)值。一種將一個(gè)單一應(yīng)用程序開發(fā)為一組小型服務(wù)的方法,每個(gè)服務(wù)都在其運(yùn)行
的進(jìn)程中。(整個(gè)醫(yī)院)
優(yōu)點(diǎn):
- 針對(duì)特定服務(wù)發(fā)布,影響小,風(fēng)險(xiǎn)小,成本低
- 頻繁發(fā)布版本,快速交付需求
- 低成本擴(kuò)容,彈性伸縮,適應(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)注冊(cè)、配置中心、消息總線、負(fù)載均衡、斷路器、數(shù)據(jù)監(jiān)控等,都可以用 Spring Boot 的開發(fā)風(fēng)格做到一鍵啟動(dòng)和部署。
Spring 并沒有重復(fù)制造輪子,它只是將目前各家公司開發(fā)的比較成熟、經(jīng)得起實(shí)際考驗(yàn)的服務(wù)框架組合起來,通過 Spring Boot 風(fēng)格進(jìn)行再封裝、屏蔽掉了復(fù)雜的配置和實(shí)現(xiàn)原理,最終給開發(fā)者留出了一套簡單易懂、易部署和易維護(hù)的分布式系統(tǒng)開發(fā)工具包。
環(huán)境搭建
在idea中新建一個(gè)maven父工程在其pom配置對(duì)應(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ū)動(dòng)--> <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 啟動(dòng)器--> <!-- <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. 新建一個(gè)子模塊api
其中只有一個(gè)實(shí)體類dept對(duì)應(yīng)我們數(shù)據(jù)庫中的表
public class Dept { private int deptnumber; private String dname; private String d_source; //對(duì)應(yīng)屬性的get和set方法 }
3. 新建一個(gè)子模塊provider作為服務(wù)的提供者
導(dǎo)入依賴
<dependencies> <!--將api模塊導(dǎo)入由此可使用Dept實(shí)體類--> <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>
配置配置文件和對(duì)應(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>
對(duì)應(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(); }
啟動(dòng)類
@SpringBootApplication public class SApplication { public static void main(String[] args) { SpringApplication.run(SApplication.class,args); } }
新建子模塊consumer作為消費(fèi)者
導(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 開始支持的一個(gè) HTTP 請(qǐng)求工具,它提供了常見的REST請(qǐng)求方案的模版,例 如 GET 請(qǐng)求、POST 請(qǐng)求、PUT 請(qǐng)求、DELETE 請(qǐng)求以及一些通用的請(qǐng)求執(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){ //請(qǐng)求的路徑,請(qǐng)求返回的對(duì)象 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); //請(qǐng)求的路徑,傳遞的參數(shù),返回的對(duì)象 return template.postForObject(url+ "/dev/add",dept,Boolean.class); } @RequestMapping("/consumer/list") public List<Dept> list(){ //請(qǐng)求的路徑,返回的對(duì)象 return template.postForObject(url+"/dev/list",void.class,List.class); } }
啟動(dòng)類及運(yùn)行結(jié)果
debug-connect refuserd---debug-傳參為null
@SpringBootApplication public class DemoApplication { public static void main(String[] args) { SpringApplication.run(DemoApplication.class,args); } }
debug
子項(xiàng)目無法使用父項(xiàng)目的依賴包
1 如果父項(xiàng)目pom使用
<dependencyManagement> <dependencies> .... </dependencies> </dependencyManagement>
方式,則子項(xiàng)目pom不會(huì)自動(dòng)使用父pom中的jar包, 如果需要使用,就要給出groupId和artifactId,無需給出version
使用是為了統(tǒng)一管理版本信息
在子工程中使用時(shí),還是需要引入坐標(biāo)的,但是不需要給出version
在我們項(xiàng)目頂層的POM文件中,元素。
通過它元素來管理jar包的版本,
讓子項(xiàng)目中引用一個(gè)依賴而不用顯示的列出版本號(hào)。
Maven會(huì)沿著父子層次向上找,
直到找到一個(gè)擁有dependencyManagement元素的項(xiàng)目,
然后它就會(huì)使用在這個(gè)dependencyManagement元素中指定的版本號(hào)。
required a bean of type 'DeptDao' that could not be found.
使用@Mapper而不是@Repository
1、使用@mapper后,不需要在spring配置中設(shè)置掃描地址,通過mapper.xml里面的namespace屬性對(duì)應(yīng)相關(guān)的mapper類,spring將動(dòng)態(tài)的生成Bean后注入到ServiceImpl中。
2、@repository則需要在Spring中配置掃描包地址,然后生成dao層的bean,之后被注入到ServiceImpl中
Connection refused connect
檢查url端口號(hào),是否寫對(duì),是否占用
RestTemplate傳遞對(duì)象無法接收(null)
在服務(wù)器端對(duì)應(yīng)的參數(shù)上添加@RequestBody
@PostMapping("/dev/add") public boolean addDept(@RequestBody Dept dept){ System.out.println(dept); return deptimpl.add(dept); }
以上就是SpringCloud入門實(shí)驗(yàn)環(huán)境搭建的詳細(xì)內(nèi)容,更多關(guān)于SpringCloud 環(huán)境搭建的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
關(guān)于Mybatis插入對(duì)象時(shí)空值的處理
這篇文章主要介紹了關(guān)于Mybatis插入對(duì)象時(shí)空值的處理方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-06-06Java編程之jdk1.4,jdk1.5和jdk1.6的區(qū)別分析(經(jīng)典)
這篇文章主要介紹了Java編程之jdk1.4,jdk1.5和jdk1.6的區(qū)別分析,結(jié)合實(shí)例形式較為詳細(xì)的分析說明了jdk1.4,jdk1.5和jdk1.6版本的使用區(qū)別,需要的朋友可以參考下2015-12-12zuul集成Sentinel,完成對(duì)path映射的限流操作
這篇文章主要介紹了zuul集成Sentinel,完成對(duì)path映射的限流操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-06-06eclipse連接數(shù)據(jù)庫并實(shí)現(xiàn)用戶注冊(cè)登錄功能
這篇文章主要介紹了eclipse連接數(shù)據(jù)庫并實(shí)現(xiàn)用戶注冊(cè)登錄功能的相關(guān)資料,需要的朋友可以參考下2021-01-01RabbitMq消息防丟失功能實(shí)現(xiàn)方式講解
這篇文章主要介紹了RabbitMq消息防丟失功能實(shí)現(xiàn),RabbitMQ中,消息丟失可以簡單的分為兩種:客戶端丟失和服務(wù)端丟失。針對(duì)這兩種消息丟失,RabbitMQ都給出了相應(yīng)的解決方案2023-01-01