P3045 [USACO12FEB]Cow Coupons G
阿新 • • 發佈:2021-10-07
服務遠端呼叫問題
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拉取服務列表
- 基於服務列表做負載均衡,選中一個微服務後發起遠端呼叫
- Provider:服務提供者
搭建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