網站首頁 編程語言 正文
微服務的設計理念在我的理解就是將服務粒子化,并對服務統一進行管理,利用http協議進行數據通信,使得restful風格的接口也能被網關很好的管理,對負載上的優點在于它將各個模塊的服務分布在不同的服務器或是不同的端口上,我們能更好的選擇可用性,一致性與分區容忍性其中兩種實現,目的很明確。
之前我們在玩springboot時,兩個不同的模塊之間的通信缺少統一化的管理,如果單一的某一模塊宕機掛掉,我們也不知道不容易做出應對,這一塊服務都不能使用,而springcloud則是多個結點符合數據一致性,保證我們服務的正常運行,不會因為某一個節點上服務的掛掉影響整個應用的使用。其次,對于服務的管理方面而言,springcloud集成了很多優秀的開源組件,今天我學習的就是服務注冊中心中的Eureka客戶端。
服務發現是基于微服務的體系結構的主要宗旨之一。嘗試手動配置每個客戶端或某種形式的約定可能很困難并且很脆弱。Eureka是Netflix Service Discovery服務器和客戶端??梢詫⒎掌髋渲煤筒渴馂楦呖捎眯裕總€服務器將有關已注冊服務的狀態復制到其他服務器。
一個比較簡單的springcloud微服務項目的架構大致如下圖:
我們都能看出來每一個服務組件功能性組件都需要在我們的服務注冊中心進行注冊,在我今天的測試項目中,只有兩個模塊product模塊與order模塊,以及我們的服務發現Eureka模塊。
首先搭建一個父工程Spring_cloud:
pom文件:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.example</groupId>
<artifactId>spring_cloud</artifactId>
<packaging>pom</packaging>
<version>1.0-SNAPSHOT</version>
<modules>
<module>product</module>
<module>eureka</module>
<module>order</module>
</modules>
<!-- 管理版本統一管理和spring相關的依賴
注意boot的版本要與cloud版本兼容
-->
<parent>
<artifactId>spring-boot-starter-parent</artifactId>
<groupId>org.springframework.boot</groupId>
<version>2.6.7</version>
</parent>
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.24</version>
<scope>provided</scope>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>2021.0.3</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<repositories>
<repository>
<id>spring-snapshots</id>
<name>Spring Snapshots</name>
<url>http://repo.spring.io/libs-snapshot-local</url>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
<repository>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<url>http://repo.spring.io/libs-milestone-local</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
<repository>
<id>spring-releases</id>
<name>Spring Releases</name>
<url>http://repo.spring.io/libs-release-local</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>spring-snapshots</id>
<name>Spring Snapshots</name>
<url>http://repo.spring.io/libs-snapshot-local</url>
<snapshots>
<enabled>true</enabled>
</snapshots>
</pluginRepository>
<pluginRepository>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<url>http://repo.spring.io/libs-milestone-local</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</pluginRepository>
</pluginRepositories>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
然后創建我們的product模塊:
pom文件導入三個依賴:
<!--數據庫驅動依賴-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!--mp依賴-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.2</version>
</dependency>
<!--引入EurekaClient-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
創建entity層:
實體類
@Data
@TableName("tb_products")
public class Product {
@TableId
private int Id;
private String productName;
private int status;
private BigDecimal price;
private String productDesc;
private int inventory;
}
創建mapper層:
接口
@Mapper
public interface ProductMapper extends BaseMapper<Product> {
}
?創建service層:
接口
public interface ProductService extends IService<Product> {
}
實現類?
@Service
@Slf4j
public class ProductServiceImpl extends ServiceImpl<ProductMapper, Product>
implements ProductService {
@Autowired
private ProductMapper productMapper;
private final QueryWrapper<Product> wrapper = new QueryWrapper<>();
/**
* 按照Id查詢商品
*
* @param id id
* @return Product
*/
public Product getProductById(int id) {
try {
wrapper.eq("id", id);
return productMapper.selectOne(wrapper);
} catch (Exception e) {
log.info("商品查詢模塊查詢商品id越界");
return null;
}
}
}
創建controller層:
controller
@RestController
@RequestMapping("product")
public class ProductController {
@Autowired
private ProductServiceImpl productService;
/**
* 根據id獲取商品信息
*
* @param id 商品id
* @return 實體
*/
@RequestMapping(value = "/{id}", method = RequestMethod.GET)
public Product getProductById(@PathVariable("id") Integer id) {
return productService.getProductById(id);
}
}
創建starter啟動類:
@SpringBootApplication
@Slf4j
public class ProductServiceStarter {
public static void main(String[] args) {
SpringApplication.run(ProductServiceStarter.class,args);
log.info("productService模塊啟動成功");
}
}
?配置application.yml文件:
server:
port: 9001
spring:
application:
name: product
datasource:
url: jdbc:mysql://localhost:3306/shop
username: root
password: ******
type: com.zaxxer.hikari.HikariDataSource
mybatis-plus:
configuration:
map-underscore-to-camel-case: false
#配置Eureka
eureka:
client:
service-url:
defaultZone: http://localhost:9000/eureka/ #多個eurekaserver之間用,隔開
instance:
prefer-ip-address: true #使用ip地址注冊
instance-id: ${spring.cloud.client.ip-address}:${server.port} #向注冊中心中注冊服務id
?之后創建order模塊:
pom文件導入三個依賴:
<!-- 數據庫驅動依賴-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!--mp依賴-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.2</version>
</dependency>
<!--引入EurekaClient-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
</dependencies>
創建entity實體層:
實體
@Data
public class Product {
private int Id;
private String productName;
private int status;
private BigDecimal price;
private String productDesc;
private int inventory;
}
?創建controller層:
controller
@RestController
@RequestMapping("order")
public class OrderController {
@Autowired(required = true)
private RestTemplate restTemplate;
@RequestMapping(value = "/buy/{id}",method = RequestMethod.GET)
public Product getProductById(@PathVariable("id")int id) {
Product product = null;
product =restTemplate.getForObject("http://localhost:9001/product/"+id,Product.class);
return product;
}
}
?創建starter啟動類:
@SpringBootApplication
@Slf4j
public class OrderServiceStarter {
@Bean
@LoadBalanced
public RestTemplate restTemplate(RestTemplateBuilder builder){
return builder.build();
}
public static void main(String[] args) {
SpringApplication.run(OrderServiceStarter.class,args);
log.info("OrderServer模板啟動成功");
}
}
?配置application.yml:
server:
port: 9002
spring:
cloud:
loadbalancer:
retry:
enabled: true
application:
name: order
datasource:
url: jdbc:mysql://localhost:3306/shop
username: root
password: 123456
type: com.zaxxer.hikari.HikariDataSource
mybatis-plus:
configuration:
map-underscore-to-camel-case: false
#配置Eureka
eureka:
client:
service-url:
defaultZone: http://localhost:9000/eureka/ #多個eurekaserver之間用,隔開
instance:
prefer-ip-address: true #使用ip地址注冊
?創建Eureka模塊:
pom文件導入一個依賴:
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
</dependencies>
?創建starter啟動類啟動Euureka客戶端服務器:
@Slf4j
@SpringBootApplication
//開啟Eureka服務
@EnableEurekaServer
public class EurekaStarter {
public static void main(String[] args) {
SpringApplication.run(EurekaStarter.class,args);
log.info("Eureka服務成功啟動");
}
}
配置application.yml文件:
#模擬兩個EurekaServer
#端口9000 , 8000
#兩個server需要相互注冊
spring:
application:
name: eureka
server:
port: 9000 #端口
#配置eureka server
eureka:
instance:
lease-renewal-interval-in-seconds: 10 #加快服務連接
client:
register-with-eureka: true #是否將自己注冊到注冊中心
fetch-registry: false #是否從eureka中獲取注冊信息
service-url: #配置暴露給Eureka Client的請求地址
defaultZone: http://127.0.0.1:9000/eureka/
server:
enable-self-preservation: false #關閉自我保護
eviction-interval-timer-in-ms: 4000 #剔除服務間隔
?最后是測試項目的結果:
訪問本機的? ip:9002/order/buy/1 成功訪問到product服務的url獲取到數據庫數據并由實體傳輸給頁面渲染,但是問題也有,服務的注冊時間太長,服務調用的響應除了第一次較快其余都不行,今天很晚了,明天看看文檔接著研究吧!
晚安啦~~~
原文鏈接:https://blog.csdn.net/m0_59588838/article/details/127274443
相關推薦
- 2022-04-23 使用matplotlib庫實現圖形局部數據放大顯示的實踐_python
- 2022-12-29 解決React報錯You?provided?a?`checked`?prop?to?a?form?f
- 2022-03-26 C++函數指針的用法詳解_C 語言
- 2022-09-15 React組件三大屬性之state,props,refs_React
- 2022-08-30 C語言遞歸函數與漢諾塔問題簡明理解_C 語言
- 2022-02-28 docker安裝17.03.0版本報錯 ->軟件包 docker-ce-selinux 已經被 do
- 2022-09-08 pytorch?tensor計算三通道均值方式_python
- 2022-03-24 Android繪制平移動畫的示例代碼_Android
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支