日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

SpringCloud 服務注冊 Eureka 與 負載均衡 RestTemplate

作者:是林春ya 更新時間: 2022-10-14 編程語言

微服務的設計理念在我的理解就是將服務粒子化,并對服務統一進行管理,利用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

欄目分類
最近更新