前言
1.之前有人給我留言說想要了解一下分布式弟疆,今天呢戚长,我們就來簡單的說一下SpringCloud分布式并且實現(xiàn)一個簡單的demo。
2.最近更新變少了怠苔,因為工作中也沒有遇到什么有意思的知識點同廉,希望大家可以提供一些想要了解的知識,私信或者評論都可以柑司。
我理解的SpringCloud
1.首先迫肖,我們的分布式系統(tǒng)都需要有一個服務注冊中心,來將所有提供服務的系統(tǒng)都注冊到系統(tǒng)中攒驰。在我了解的兩種分布式框架:Double(阿里)蟆湖、SpringCloud(Spring),在這兩種里面玻粪,我選擇了Spring隅津。我認為SpringCloud更加簡捷方便一些。
2.其次劲室,有了注冊中心伦仍,那我們就需要有服務的提供者,也就是我們所說的微服務很洋,只需要在項目中加入幾個簡單的配置充蓝,就可以將服務注冊到注冊中心,供其他客戶端使用。
3.最后呢谓苟,我們還需要注冊消費者官脓,通過消費者來消費注冊中心中的服務接口。
SpringCloud代碼實現(xiàn)
一娜谊、SpringCloud服務注冊中心
1.使用IntelliJ IDEA或者是其他的Java IDE創(chuàng)建一個Springboot項目确买,命名為eureka-server,當然這個自由選擇哈纱皆。
2.等待MAVEN構建好項目之后湾趾,打開pom.xml進行配置,并添加如下依賴派草。
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
<spring-cloud.version>Finchley.SR1</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
3.打開主類搀缠,也就是啟動類,添加如下注解近迁,將該項目注冊為服務注冊中心艺普。
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
@SpringBootApplication
@EnableEurekaServer
public class EurekaServerApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaServerApplication.class, args);
}
}
4.打開項目中的application.properties我會將其重命名為application.yml,其實兩種格式并沒有什么分別鉴竭,只是個人喜好而已歧譬。
5.修改application.yml配置,如下搏存。
# 端口號
server:
port: 8768
# 注冊中心配置
eureka:
instance:
hostname: 你的IP地址或者主機名或者是localhost
client:
registerWithEureka: false
fetchRegistry: false
serviceUrl:
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
spring:
application:
name: eurka-server
6.它的配置還有很多瑰步,比如
eureka.server.enable-self-preservation # 設為false,關閉自我保護
eureka.server.eviction-interval-timer-in-ms # 清理間隔(單位毫秒璧眠,默認是60*1000)
配置有很多缩焦,大家可以去官方文檔查看一下,按需配置责静。
7.自此注冊中心算是配置完善袁滥,啟動項目后,訪問對應端口即可看到如下頁面灾螃。
二题翻、SpringCloud服務提供者
1.同上創(chuàng)建Springboot項目,選擇創(chuàng)建為WEB項目腰鬼,名為service-test可以選擇常用的持久化框架mybatis藐握、JAP等等,選擇數(shù)據(jù)庫驅動垃喊。當然持久化框架可以不選,待MAVEN構建好項目之后可以手動加入自己的持久化袜炕,比如我常用的mybatis-plus或者hibernate本谜、JDBC等等。
2.打開pom.xml添加依賴
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
<spring-cloud.version>Finchley.SR1</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
3.打開啟動類偎窘,添加注釋@EnableEurekaClient注冊成為服務提供者乌助。
4.配置application.yml
server:
port: 8888
spring:
application:
name: service-test
eureka:
client:
serviceUrl:
defaultZone: http://你的服務注冊中心地址:端口/eureka/
instance:
hostname: 服務提供者地址溜在,及當前項目service-test所在ip
5.啟動項目后,可以在服務注冊中心的日志中看到如下結果:
Registered instance SERVICE-TEST/192.168.12.18:service-test:8888 with status UP (replication=false)
也可以在瀏覽器打開服務注冊中心查看服務是否注冊成功:
6.如上即為可提供服務他托,接下來就可以編寫我們的服務代碼掖肋,這里我們簡單的以返回字符串為例子。TestController
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/test")
public class TestController {
@RequestMapping("/testOne")
public String testOne() {
return "成功進入";
}
}
三赏参、SpringCloud服務消費
1.由上面的Java代碼可以看出志笼,我們的service-test服務者提供了一個/test/testOne的服務,那我們接下來就來創(chuàng)建一個消費者來消費該服務把篓。
2.依舊創(chuàng)建Springboot項目纫溃,命名為consumer添加同上依賴,在application.yml中添加如下配置
eureka:
client:
serviceUrl:
defaultZone: http://注冊中心地址:端口/eureka/
instance:
hostname: 當前IP
server:
port: 端口
spring:
application:
name: consumer
3.在啟動類中添加如下注解韧掩,注冊為消費者紊浩。
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.cloud.openfeign.EnableFeignClients;
@SpringBootApplication
@EnableEurekaClient
@EnableDiscoveryClient
@EnableFeignClients
public class ConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(ConsumerApplication.class, args);
}
}
4.編寫ConsumerService.java接口,以此消費我們service-test中提供的服務疗锐。代碼如下:
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.stereotype.Service;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
@Service
// 從服務注冊中心中通過名稱查找服務
@FeignClient(value = "service-test")
public interface ConsumerService {
// 消費該服務提供者提供的“/test/testOne”服務
@RequestMapping(value = "/test/testOne", method = RequestMethod.GET)
String testOne();
}
5.編寫ConsumerController.java
@RestController
public class ConsumerController {
@Autowired
private TestService testService;
@GetMapping("/test")
public String test() {
return testService.testOne();
}
}
6.啟動項目后同樣可以在服務注冊中心的控制臺以及頁面查看注冊信息坊谁。
7.查看到服務注冊成功之后,我們正常訪問滑臊,localhost:端口/test口芍。就可以看到頁面會返回成功進入的字樣,即代表我們的服務消費成功简珠。
四阶界、SpringCloud分布式服務器部署測試
1.正好手頭有不少服務器,我們來部署測試一下聋庵,是否實現(xiàn)了簡單的分布式膘融。
2.首先將我們的三個項目打包為jar文件上傳至服務器當中。具體操作如下
3.待命令執(zhí)行完后祭玉,可以在項目的target目錄中看到生成的jar文件氧映。
4.通過scp命令將jar包上傳至服務器目錄
scp -r 文件本地路徑 服務器用戶名@服務器ip:/home/用戶名
5.接下來就是啟動jar包
# nohup 為后臺執(zhí)行,如果不使用該命令脱货,當關閉終端或者斷開鏈接時岛都,jar也會停止運行,導致項目無法訪問
nohup java -Dserver.port=部署端口 -jar 文件名
6.待項目全部部署完畢振峻,我們先來看一下服務注冊中心臼疫。
可以看到兩個服務均注冊成功,我們運行看一下扣孟。
與本地運行相同烫堤,但我們的三個項目時部署到不同的服務器當中的,以此也就實現(xiàn)了簡單的分布式部署。
五鸽斟、SpringCloud拔创、Ribbon開啟負載均衡
1.我們需要啟動同一個服務兩次,在不同的端口或者是服務器富蓄。
2.項目啟動后可以在注冊中心看到同名為service-test的服務有兩個剩燥。
3.在消費者的主類中添加如下代碼開啟負載均衡。
@Bean
@LoadBalanced
RestTemplate restTemplate() {
return new RestTemplate();
}
4.這樣立倍,他會根據(jù)訪問的次序灭红,自動的將用戶分配到不同的服務器或者端口。
最后說幾句
1.當然這只是最基礎的一部分帐萎。我也還在不斷的學習和深入了解當中比伏。
2.至于這樣部署的好處嘛,不僅減輕了服務器的負擔疆导,同樣降低了耦合赁项,如果我們只是下線一部分功能或者對功能進行升級,不會對整體造成影響澈段。
3.感謝大家的關注和支持悠菜,希望大家多多提出意見。
4.我在自己的服務器當中搭建了GitLab服務器败富,使用后感覺也是非常不錯悔醋,如果有想要嘗試自己搭建或者使用我搭建好的可以私信或者評論告訴我。
5.謝謝大家??????