springcloud
springCloud是分布式微服務整體解決方案。
Spring Cloud 為開發者提供了在分布式系統(配置管理,[服務發現,熔斷,路由,微代理,控制總線,一次性token,全局瑣,leader選舉,分布式session,叢集狀态)中快速建構的工具,使用Spring Cloud的開發者可以快速的啟動服務或建構應用、同時能夠快速和雲平台資源進行對接。
SpringCloud分布式開發五大常用元件:
- 服務發現——Netflix Eureka
- 客服端負載均衡——Netflix Ribbon
- 斷路器——Netflix Hystrix
- 服務網關——Netflix Zuul
- 分布式配置——Spring Cloud Config
springCloud體驗
eureka 服務發現與注冊
RestTemplate 發送http請求
遠端調用
dubbo+zookeep體驗
dubbo是一個遠端調用服務的分布式架構,可以實作遠端通訊、動态配置、位址路由等等功能。它可以通過內建注冊中心,來動态地治理服務釋出和服務調用。相當于把服務注冊和釋出推送的功能分攤給了(zookeeper)注冊中心
Dubbo實作服務調用是通過RPC的方式,即用戶端和服務端共用一個接口(将接口打成一個jar包,在用戶端和服務端引入這個jar包),用戶端面向接口寫調用,服務端面向接口寫實作,中間的網絡通信交給架構去實作
Zookeeper 是 Apacahe Hadoop 的子項目,是一個樹型的目錄服務,支援變更推送,适合作為 Dubbo 服務的注冊中心。【參考】
-
安裝zookeep
可以通過docker容器快速安裝
- 引入需要的依賴
<!--引入dubbo-->
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>0.1.0</version>
</dependency>
<!--引入zookeeper用戶端工具-->
<!-- https://mvnrepository.com/artifact/com.101tec/zkclient -->
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>0.10</version>
</dependency>
- 服務提供端
----服務接口
package com.xiaoai.ticket.service;
public interface TicketService {
public String getTicket();
}
----服務接口實作
@Component
@com.alibaba.dubbo.config.annotation.Service // 該注解即把服務釋出出去
public class TicketServiceImpl implements TicketService{
@Override
public String getTicket() {
return "《厲害了,我的國》";
}
}
----配置檔案
dubbo:
application:
name: provider-ticket
registry:
address: zookeeper://192.168.121.128:2181
scan:
base-packages: com.xiaoai.ticket.service
- 服務消費端
----建立一樣的接口
package com.xiaoai.ticket.service;
public interface TicketService {
public String getTicket();
}
----相關服務中調用遠端服務
@Service
public class UserService {
@Reference // 引入相關遠端服務
TicketService ticketService;
public void hello(){
String ticket = ticketService.getTicket();
System.out.println("拿到票:"+ticket);
}
}
----配置檔案
dubbo:
application:
name: consumer-user
registry:
address: zookeeper://192.168.121.128:2181
使用dubbo注意在啟動器中開啟dubbo支援:【@EnableDubbo】
- 測試
----在用戶端調用遠端服務
@RunWith(SpringRunner.class)
@SpringBootTest
class ConsumerUserApplicationTests {
@Autowired
UserService userService;
@Test
void contextLoads() {
userService.hello();
}
}
----結果
拿到票:《厲害了,我的國》
dubbo+nacos+zuul體驗
dubbo 遠端調用
nacos 配置中心、服務發現
zuul 網關路由
例子:應用項目去調用消費服務項目,消費服務項目去調用提供服務項目
- 引入依賴
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<version>0.9.0.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
<version>0.9.0.RELEASE</version>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dubbo</artifactId>
<version>2.1.1.RELEASE</version>
</dependency>
在啟動類中添加注解【@EnableDiscoveryClient】開啟服務發現
服務接口可單獨提取作api項目,在實作項目中引入api項目實作相關接口即可,在其他項目需要另一個項目的服務時直接引入api項目即可。
----服務接口
package com.xiaowei.service2.api;
public interface ProviderService {
public String service();
}
----服務接口實作
package com.xiaowei.service2.service;
@org.apache.dubbo.config.annotation.Service
public class ProviderServiceImpl implements ProviderService {
@Override
public String service() {
return "Provider Invoke【提供服務端service2-server】執行...";
}
}
----配置檔案
server:
port: ${port:56040} #啟動端口 指令行注入
servlet:
context-path: /service2
spring:
application:
name: service2
main:
allow-bean-definition-overriding: true
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848 #
namespace: 62f4e350-bb14-4271-9b4e-6ba2005f3f1c
cluster-name: DEFAULT
# 連接配接配置中心配置對應配置檔案,通過配置中心可擷取項目相關配置,
# 該項目暫未有其他配置,隻是先配置連接配接 即可不配置
# config:
# server-addr: 127.0.0.1:8848 # 配置中心位址
# file-extension: yaml # 配置檔案字尾 預設是context-path.字尾來查找配置中心的檔案
# namespace: 62f4e350-bb14-4271-9b4e-6ba2005f3f1c # 開發環境
# group: XIAOAI_MICROSERVICE_GROUP # 業務組,可了解為那個項目
dubbo:
scan:
base-packages: com.xiaowei.service2.service
protocol:
name: dubbo
port: ${dubbo_port:20891}
registry:
address: nacos://127.0.0.1:8848
application:
qos-enable: false
consumer:
check: false
- 消費服務端
----服務接口
package com.xiaowei.service1.api;
public interface ConsumerService {
public String service();
}
----服務接口實作
package com.xiaowei.service1.service;
@org.apache.dubbo.config.annotation.Service
public class ConsumerServiceImpl implements ConsumerService {
@org.apache.dubbo.config.annotation.Reference
private ProviderService providerService;
@Override
public String service() {
return "Consumer Invoke【消費服務端service1-server】執行...調用【提供服務端】:\n"+providerService.service();
}
}
----配置檔案
server:
port: ${port:56030} #啟動端口 指令行注入
servlet:
context-path: /service1
spring:
application:
name: service1
main:
allow-bean-definition-overriding: true
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848 #
namespace: 62f4e350-bb14-4271-9b4e-6ba2005f3f1c
cluster-name: DEFAULT
# 連接配接配置中心配置對應配置檔案,通過配置中心可擷取項目相關配置,
# 該項目暫未有其他配置,隻是先配置連接配接 即可不配置
# config:
# server-addr: 127.0.0.1:8848 # 配置中心位址
# file-extension: yaml # 配置檔案字尾 預設是context-path.字尾來查找配置中心的檔案
# namespace: 62f4e350-bb14-4271-9b4e-6ba2005f3f1c # 開發環境
# group: XIAOAI_MICROSERVICE_GROUP # 業務組,可了解為那個項目
dubbo:
scan:
base-packages: com.xiaowei.service1.service
protocol:
name: dubbo
port: ${dubbo_port:20881}
registry:
address: nacos://127.0.0.1:8848
application:
qos-enable: false
consumer:
check: false
- 應用端
----應用端
package com.xiaowei.application.rest;
@RestController
@RequestMapping("/application1")
public class ApplicationController {
@org.apache.dubbo.config.annotation.Reference
private ConsumerService consumerService;
@GetMapping(value = "/service")
public String service(){
String target=consumerService.service();
return "application Invoke【應用端application-1】執行...調用【消費服務端】:\n"+target;
}
}
----配置檔案
server:
port: ${port:56020} #啟動端口 指令行注入
servlet:
context-path: /application1
spring:
application:
name: application1
main:
allow-bean-definition-overriding: true
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848 #
namespace: 62f4e350-bb14-4271-9b4e-6ba2005f3f1c
cluster-name: DEFAULT
# 連接配接配置中心配置對應配置檔案,通過配置中心可擷取項目相關配置,
# 該項目暫未有其他配置,隻是先配置連接配接 即可不配置
# config:
# server-addr: 127.0.0.1:8848 # 配置中心位址
# file-extension: yaml # 配置檔案字尾 預設是context-path.字尾來查找配置中心的檔案
# namespace: 62f4e350-bb14-4271-9b4e-6ba2005f3f1c # 開發環境
# group: XIAOAI_MICROSERVICE_GROUP # 業務組,可了解為那個項目----配置檔案
server:
port: ${port:56020} #啟動端口 指令行注入
servlet:
context-path: /application1
spring:
application:
name: application1
main:
allow-bean-definition-overriding: true
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848 #
namespace: 62f4e350-bb14-4271-9b4e-6ba2005f3f1c
cluster-name: DEFAULT
# 連接配接配置中心配置對應配置檔案,通過配置中心可擷取項目相關配置,
# 該項目暫未有其他配置,隻是先配置連接配接 即可不配置
# config:
# server-addr: 127.0.0.1:8848 # 配置中心位址
# file-extension: yaml # 配置檔案字尾 預設是context-path.字尾來查找配置中心的檔案
# namespace: 62f4e350-bb14-4271-9b4e-6ba2005f3f1c # 開發環境
# group: XIAOAI_MICROSERVICE_GROUP # 業務組,可了解為那個項目
以上即可通過dubbo實作正常服務調用了
可以加入網關服務,完成路由轉發。網關:将兩個使用不同協定的網絡段連接配接bai在一起。可以看成将兩個不同項目的服務進行連接配接。
- zuul網關
----啟動器開啟網關代理
@SpringBootApplication
@EnableDiscoveryClient //開啟服務發現
@EnableZuulProxy // 開啟網關代理
public class ApiGatewayBootstrap {
public static void main(String[] args) {
SpringApplication.run(ApiGatewayBootstrap.class,args);
}
}
----配置檔案
server:
port: 8000 #啟動端口 指令行注入
spring:
application:
name: api-gateway
main:
allow-bean-definition-overriding: true
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848 #
namespace: 62f4e350-bb14-4271-9b4e-6ba2005f3f1c
cluster-name: DEFAULT
# 由于需要用到配置中心的配置,是以需要配置nacos相關資訊
config:
server-addr: 127.0.0.1:8848 #
file-extension: yaml
namespace: 62f4e350-bb14-4271-9b4e-6ba2005f3f1c
group: XIAOAI_MICROSERVICE_GROUP
----配置中心配置檔案:application1.yml
zuul:
routes:
application1:
stripPreFix: false
path: /application1/** # 把以application1開頭的請求路徑都轉發到服務名為application1的應用中
- 測試
----通路:http://localhost:56020/application1/application1/service
application Invoke【應用端application-1】執行...調用【消費服務端】:
Consumer Invoke【消費服務端service1-server】執行...調用【提供服務端】:
Provider Invoke【提供服務端service2-server】執行...
----通路:http://localhost:8000/application1/application1/service
application Invoke【應用端application-1】執行...調用【消費服務端】:
Consumer Invoke【消費服務端service1-server】執行...調用【提供服務端】:
Provider Invoke【提供服務端service2-server】執行...
