1. 程式人生 > 其它 >P3045 [USACO12FEB]Cow Coupons G

P3045 [USACO12FEB]Cow Coupons G

服務遠端呼叫問題

    public Order queryById(Long id){
        Order order = orderMapper.findById(id);
        String url = "http://localhost:8081/user/"+order.getUserId();
        User user = restTemplate.getForObject(url, User.class);
        order.setUser(user);
        return order;
    }
  • 出現硬編碼
  • 如果有多個服務提供者,消費者如何選擇
  • 消費者如何得知服務提供者的狀態

服務提供者:一次業務處理過程中,被其它微服務呼叫的服務(提供介面給其它微服務)

服務消費者:一次業務處理過程中,呼叫其它微服務的服務(呼叫其它微服務提供的介面)

Eureka註冊中心

Eureka工作流程

1、每一個微服務(服務的提供者和消費者)啟動時,就必須向eureka-server中註冊自身服務資訊

2、當服務消費者需要服務提供者時,會去eureka-server中拉起服務提供者(服務提供者狀態都是良好的)的資訊

3、服務消費者可以通過負載均衡獲取一個服務提供者的資訊,遠端呼叫即可

微服務會定期向eureka-server傳送心跳,如果不傳送,eureka-server就會移除其服務資訊

Eureka作用

  • 消費者該如何獲取服務提供者具體資訊?
    • 服務提供者啟動時向eureka註冊自己的資訊
    • eureka儲存這些資訊
    • 消費者根據服務名稱向eureka拉取提供者資訊
  • 如果有多個服務提供者,消費者該如何選擇?
    • 服務消費者利用負載均衡演算法,從服務列表中挑選一個
  • 消費者如何感知服務提供者健康狀態?
    • 服務提供者會每隔30秒向EurekaServer傳送心跳請求,報告健康狀態
    • eureka會更新記錄服務列表資訊,心跳不正常會被剔除
    • 消費者就可以拉取到最新的資訊

搭建Eureka

在Eureka架構中,微服務角色有兩類:

  • EurekaServer:服務端,註冊中心
    • 記錄服務資訊
    • 心跳監控
  • EurekaClient:客戶端
    • Provider:服務提供者
      • 註冊自己的資訊到EurekaServer
      • 每隔30秒向EurekaServer傳送心跳
    • consumer:服務消費者
      • 根據服務名稱從EurekaServer拉取服務列表
      • 基於服務列表做負載均衡,選中一個微服務後發起遠端呼叫

搭建EurekaServer

建立專案,新增eureka服務端依賴

    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
        </dependency>
    </dependencies>
View Code

編寫啟動類,開啟EurekaServer(@EnableEurekaServer)

@SpringBootApplication
@EnableEurekaServer
public class EurekaServerApplication {
    public static void main(String[] args) {
        SpringApplication.run(EurekaServerApplication.class,args);
    }
}
View Code

新增application.yml檔案

server:
  port: 10081
  
#eureka服務註冊
spring:
  application:
    name: eurekaserver #eureka服務名
eureka:
  client:
    service-url:  #eureka地址資訊
      defaultZone: http://localhost:10081/eureka

eureka也是個微服務,並把自己也註冊到eureka,可以實現eureka叢集

defaultZone可以有多個eureka地址資訊,中間以逗號隔開

注意:埠號為10080時,會失敗,不知到為什麼

微服務註冊

在微服務專案中新增eureka客戶端依賴

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>

配置註冊資訊(微服務名、eureka地址)

server:
  port: 8081
spring:
  datasource:
    url: jdbc:mysql://192.168.223.129:3306/cloud-user?useSSL=false
    username: root
    password: root
    driver-class-name: com.mysql.cj.jdbc.Driver
  application:
    name: userservice
mybatis:
  type-aliases-package: com.marw.pojo
  configuration:
    map-underscore-to-camel-case: true

eureka:
  client:
    service-url:
      defaultZone: http://localhost:10081/eureka/
View Code

將user-service多次啟動,模擬多例項部署,為了避免埠衝突,需要修改埠號

-DServer.port=8083

服務發現

修改訪問的url路徑,用註冊到eureka的服務名替換ip和埠

String url = "http://userservice/user/"+order.getUserId();

在例項化RestTemplate方法上新增負載均衡註解(@LoadBalanced)

    @Bean
    @LoadBalanced
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }

測試效果:

分別訪問http://localhost:8082/order/101 、http://localhost:8082/order/102