Я практикую использовать балансировку нагрузки с использованием Netflix Zuul и Eureka Server в Spring Boot. И я столкнулся с проблемой.
Итак, я создал проект 2 Spring Boot. Один проект для создания Eureka Server и один для создания Eureka Client. Вот код обоих проектов.
Проект Eureka Server
package com.example.eureka;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
@SpringBootApplication
@EnableEurekaServer
public class EurekaServerApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaServerApplication.class, args);
}
}
и application.yaml
# This default profile is used when running a single instance completely standalone:
spring:
profiles: default
server:
port: 9000
eureka:
instance:
hostname: my-eureka-server.com
client:
registerWithEureka: false
fetchRegistry: false
serviceUrl:
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
---
spring:
profiles: united-states
application:
name: eureka-server-clustered # ==> This is Service-Id
server:
port: 9001
eureka:
instance:
hostname: my-eureka-server-us.com
client:
registerWithEureka: false
fetchRegistry: false
serviceUrl:
defaultZone: http://my-eureka-server-fr.com:9002/eureka/,http://my-eureka-server-vn.com:9003/eureka/
---
spring:
profiles: france
application:
name: eureka-server-clustered # ==> This is Service-Id
server:
port: 9002
eureka:
instance:
hostname: my-eureka-server-fr.com
client:
registerWithEureka: false
fetchRegistry: false
serviceUrl:
defaultZone: http://my-eureka-server-us.com:9001/eureka/,http://my-eureka-server-vn.com:9003/eureka/
---
spring:
profiles: vietnam
application:
name: eureka-server-clustered # ==> This is Service-Id
server:
port: 9003
eureka:
instance:
hostname: my-eureka-server-vn.com
client:
registerWithEureka: false
fetchRegistry: false
serviceUrl:
defaultZone: http://my-eureka-server-us.com:9001/eureka/,http://my-eureka-server-fr.com:9002/eureka/
Я уже добавил новое доменное имя в C:\Windows\System32\drivers\etc\host
И проект Eureka_Client
package com.example.config;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import com.netflix.discovery.EurekaClient;
@SpringBootApplication
@Controller
public class EurekaClientApplication {
@Autowired
private DiscoveryClient discoveryClient;
@Autowired
@Lazy
private EurekaClient eurekaClient;
@Value("${eureka.instance.appname}")
private String appName;
@Value("${server.port}")
private String port;
public static void main(String[] args) {
SpringApplication.run(EurekaClientApplication.class, args);
}
@RequestMapping("/client")
public String getService(Model m) {
List<String> listService = discoveryClient.getServices();
String name = eurekaClient.getApplication(appName).getName();
String info = "Name app: " + name + " Port: " + port;
m.addAttribute("info",info);
m.addAttribute("listService",listService);
return "service";
}
@RequestMapping("/home")
public String goHome() {
return "home";
}
}
и application.yaml
spring:
application:
name: ABC-SERVICE # ==> This is Service-Id
---
# Items that apply to ALL profiles:
eureka:
instance:
appname: ABC-SERVICE # ==> This is a instance of ABC-SERVICE
client:
fetchRegistry: true
serviceUrl:
defaultZone: http://my-eureka-server-us.com:9001/eureka
server:
port: 8000
---
spring:
profiles: firstService
eureka:
instance:
appname: ABC-SERVICE # ==> This is a instance of ABC-SERVICE
preferIpAddress: true
client:
fetchRegistry: true
serviceUrl:
defaultZone: http://my-eureka-server-us.com:9001/eureka
server:
port: 8001
---
spring:
profiles: secondService
eureka:
instance:
appname: ABC-SERVICE # ==> This is a instance of ABC-SERVICE
preferIpAddress: true
client:
fetchRegistry: true
serviceUrl:
defaultZone: http://my-eureka-server-us.com:9001/eureka
server:
port: 8002
---
spring:
profiles: thirdService
eureka:
instance:
appname: ABC-SERVICE # ==> This is a instance of ABC-SERVICE
preferIpAddress: true
client:
fetchRegistry: true
serviceUrl:
defaultZone: http://my-eureka-server-us.com:9001/eureka
server:
port: 8003
Я запустил оба проекта с различным профилем пружины одновременно, и он работает очень хорошо. Когда я нажимаю на этот URL http://localhost:8001/home
или http://localhost:8001/service
, он возвращает именно то, что я хочу.
А потом я создал проект для Netflix Zuul и вот его application.yaml
файл
eureka:
client:
fetchRegistry: true
registerWithEureka: true
serviceUrl:
defaultZone: http://my-eureka-server-us.com:9001/eureka
instance:
preferIpAddress: true
server:
port: 8762
spring:
application:
name: zuul-server
И когда я нажимаю этот URL localhost:8762/ABC-SERVICE/home
или localhost:8762/ABC-SERVICE/client
, браузер возвращает сообщение об ошибке белой страницы.
Я знаю, что что-то не так с настройкой Netflix Zuul в моем проекте. Можете ли вы, парень, помочь мне разобраться?