認識微服務(wù)
微服務(wù)技術(shù)對比
Dubbo | SpringCloud | SpringCloudAlibaba | |
---|---|---|---|
注冊中心 | zookeeper, Redis | Eureka, Consul | Nacos, Eureka |
服務(wù)遠程調(diào)用 | Dubbo協(xié)議 | Feign(http協(xié)議) | Dubbo, Feign |
配置中心 | 無 | SpringCloudConfig | SpringCloudConfig, Nacos |
服務(wù)網(wǎng)關(guān) | 無 | SpringCloudGateway, Zuul | SpringCloudGateway, Zuul |
服務(wù)監(jiān)控和保護 | dubbo-admin, 功能弱 | Hystrix | Sentinel |
分布式服務(wù)架構(gòu)案例
遠程調(diào)用
- 注冊RestTemplate
/** * 創(chuàng)建RestTemplate并注入Spring容器 * @return */ @Bean public RestTemplate restTemplate(){ return new RestTemplate(); }
- 服務(wù)遠程調(diào)用RestTemplate
@Autowired private RestTemplate restTemplate; public Order queryOrderById(Long orderId) { // 1.查詢訂單 Order order = orderMapper.findById(orderId); // 2. 利用RestTemplate發(fā)起http請求, 查詢用戶 // 2.1 url路徑 String url = "http://localhost:8081/user/"+order.getUserId(); // 2.2 發(fā)送http請求, 實現(xiàn)遠程調(diào)用 User user = restTemplate.getForObject(url, User.class); // 3 封裝user到order order.setUser(user); // 4.返回 return order; }
eureka注冊中心
原理
在Eureka架構(gòu)中, 微服務(wù)角色有兩類:文章來源:http://www.zghlxwxcb.cn/news/detail-576652.html
- EurekaServer: 服務(wù)端, 注冊中心
- 記錄服務(wù)信息
- 心跳監(jiān)控
- EurekaClient: 客戶端
- Provider: 服務(wù)提供者
- 注冊自己的信息到EurekaServer
- 每隔30秒向EurekaServer發(fā)送心跳
- Consumer: 服務(wù)消費者
- 根據(jù)服務(wù)名稱從EurekaServer拉取服務(wù)列表
- 基于服務(wù)列表做負載均衡, 選中一個微服務(wù)后發(fā)起遠程調(diào)用
- Provider: 服務(wù)提供者
搭建EurekaServer
- 引入eureka-server依賴
<!-- eureka服務(wù)端 --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> </dependency>
- 添加@EnableEurekaServer注解
@EnableEurekaServer @SpringBootApplication public class EurekaApplication { public static void main(String[] args) { SpringApplication.run(EurekaApplication.class, args); } }
- 在application.yml中配置eureka地址
server: port: 10086 spring: application: name: eurekaserver eureka: client: service-url: defaultZone: http://127.0.0.1:10086/eureka/
服務(wù)注冊
- 引入eureka-client依賴
<!-- eureka客戶端 --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency>
- 在application.yml中配置eureka地址
- 啟動多個實例: 右鍵服務(wù)copy configuration, 在啟動項vm option中修改端口號
服務(wù)發(fā)現(xiàn)
- 給RestTemplate添加@LoadBalanced注解, 負載均衡
@LoadBalanced public RestTemplate restTemplate(){ return new RestTemplate(); }
- 用服務(wù)提供者的服務(wù)名稱遠程調(diào)用
// String url = "http://localhost:8081/user/"+order.getUserId(); String url = "http://userserver/user/"+order.getUserId();
Ribbon負載均衡
修改負載均衡
- 代碼方式 (全體)
/** * 更換負載均衡策略為隨機 * @return */ @Bean public IRule randomRule() { return new RandomRule(); } ```erer
- 配置文件方式 (只針對某個微服務(wù))
userserver: # 給某個微服務(wù)配置負載均衡規(guī)則,這里是userserver服務(wù) ribbon: NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule # 負載均衡規(guī)則
饑餓加載
- Ribbon默認是采用懶加載, 即第一次訪問時才會創(chuàng)建LoadBalanceClient, 請求時間很長.
- 饑餓加載在項目啟動時創(chuàng)建, 降低第一次訪問的耗時
ribbon: eager-load: # 饑餓加載 enabled: true clients: userserver # 指定服務(wù)
nacos注冊中心
快速入門
- 父工程添加spring-cloud-alibaba管理依賴
<!-- nacos的管理依賴 --> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-alibaba-dependencies</artifactId> <version>2.2.5.RELEASE</version> <type>pom</type> <scope>import</scope> </dependency>
- nacos客戶端依賴
<!-- nacos客戶端依賴 --> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency>
- 配置文件
spring: cloud: nacos: server-addr: localhost:8848 # nacos服務(wù)地址
- 集群配置
spring: cloud: nacos: server-addr: localhost:8848 # nacos服務(wù)地址 discovery: cluster-name: SH # 集群地址
- NacosRule負載均衡策略
userserver: # 給某個微服務(wù)配置負載均衡規(guī)則,這里是userservice服務(wù) ribbon: # NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule # 負載均衡規(guī)則 NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule # 負載均衡規(guī)則
- 優(yōu)先選擇同集群服務(wù)實例列表
- 本地集群找不到提供者, 才去其他集群尋找, 并且會報警告
- 確定了可用實例列表后, 再采用隨機負載均衡挑選實例
- 命名空間
spring: cloud: nacos: discovery: namespace: xxx # 命令空間
- namespace用來做環(huán)境隔離
- 每個namespace都有唯一id
- 不同namespace下的服務(wù)不可見
eureka和nacos對比
- nacos非臨時實例
spring: cloud: nacos: discovery: ephemeral: false # 設(shè)置為非臨時實例
- nacos與eureka的共同點
- 都支持服務(wù)注冊和服務(wù)拉取
- 都支持服務(wù)提供者心跳方式做健康檢測
- nacos與eureka的區(qū)別
- nacos支持服務(wù)端主動檢測提供者狀態(tài): 臨時實例采用心跳模式, 非臨時實例采用主動檢測模式
- 臨時實例心跳不正常會被剔除, 非臨時實例則不會被剔除
- nacos支持服務(wù)列表變更的消息推送模式, 服務(wù)列表更新更及時
- nacos集群默認采用ap方式(強調(diào)數(shù)據(jù)的可用性), 當集群中存在非臨時實例時, 采用cp模式(強調(diào)數(shù)據(jù)的可靠性和一致性); eureka采用ap方式
來源
黑馬程序員. SpringCloud微服務(wù)文章來源地址http://www.zghlxwxcb.cn/news/detail-576652.html
到了這里,關(guān)于JavaWeb_SpringCloud微服務(wù)_Day1-eureka, ribbon, nacos的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!