#java #spring-boot #kubernetes
Вопрос:
У меня есть приложение Spring Boot, которое использует Thymeleaf в качестве движка шаблонов, закрепленного в кластере Kubernetes, в котором есть Istio. Я могу развернуть это приложение и запустить его. Я использую порт узла, и когда я проверяю запущенные службы, я получаю рабочий URL-адрес на порту 30314. Но всякий раз, когда я нажимаю ссылку в своем веб-приложении, она приводит меня к одному и тому же URL-адресу без номера порта, что, конечно, делает доступ невозможным, если я вручную не введу номер порта обратно. Честно говоря, я не знаю, что делать. Я серьезно застрял здесь на некоторое время.
Вот развертывание и обслуживание приложения Spring Boot:
kind: Service
apiVersion: v1
metadata:
name: springboot-k8s-mysql
labels:
name: springboot-k8s-mysql
spec:
ports:
- port: 8080
protocol: TCP
selector:
app: springboot-k8s-mysql
type: NodePort
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: springboot-k8s-mysql
spec:
selector:
matchLabels:
app: springboot-k8s-mysql
replicas: 1
template:
metadata:
labels:
app: springboot-k8s-mysql
spec:
containers:
- name: springboot-k8s-mysql
image: basiclogin
imagePullPolicy: Never
ports:
- containerPort: 8080
env:
- name: DB_HOST
valueFrom:
configMapKeyRef:
name: db-conf
key: host
- name: DB_NAME
valueFrom:
configMapKeyRef:
name: db-conf
key: name
- name: DB_USERNAME
valueFrom:
secretKeyRef:
name: db-root-credentials
key: username
- name: DB_PASSWORD
valueFrom:
secretKeyRef:
name: db-root-credentials
key: password
Вот мой файл application.properties, на всякий случай, если он вам понадобится:
spring.datasource.url=jdbc:mysql://mysql/userdata?allowPublicKeyRetrieval=trueamp;useSSL=falseamp;serverTimezone=Europe/Madrid
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
logging.level.org.hibernate.SQL=debug
spring.jpa.show-sql=true
spring.jpa.database-platform=org.hibernate.dialect.MySQL8Dialect
spring.jpa.hibernate.ddl-auto=update
server.servlet.session.timeout=2m
server.port=8080
Я выяснил, что созданные Thymeleaf URL-адреса успешно содержат номер порта и работают правильно.
Но всякий раз, когда приложению нужно пройти какую-либо логику перед перенаправлением, оно должно пройти через контроллер, который не может создать связь с текущим портом.
Вот мой контроллер пружинной загрузки:
package com.millan.springboot.form.app.controller;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import com.millan.springboot.form.app.entity.User;
import com.millan.springboot.form.app.repository.UserRepository;
@Controller
public class AppController {
@Autowired
private UserRepository userRepo;
//--------
@GetMapping("")
public String viewHomePage() {
return "index";
}
@GetMapping("/register")
public String showRegistrationForm(Model model) {
model.addAttribute("user", new User()); // Crea un nuevo user.
return "signup_form";
}
@PostMapping("/process_register")
public String processRegister(User user) {
BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
String encodedPassword = passwordEncoder.encode(user.getPassword());
user.setPassword(encodedPassword);
userRepo.save(user);
return "register_success";
}
@GetMapping("/users")
public String listUsers(Model model) {
List<User> listUsers = userRepo.findAll();
model.addAttribute("listUsers", listUsers);
return "users";
}
@GetMapping("/login")
public String userLogin() {
return "login";
}
}
And here’s one of the Thymeleaf templates.
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Login Basico con Thymeleaf</title>
<link rel="stylesheet" type="text/css"
href="/webjars/bootstrap/css/bootstrap.min.css" />
<script type="text/javascript" src="/webjars/jquery/jquery.min.js"></script>
<script type="text/javascript"
src="/webjars/bootstrap/js/bootstrap.min.js"></script>
</head>
<body>
<div class="container text-center">
<h1>Login y registro</h1>
<h3>
<a th:href="@{/users}">List of Users</a>
</h3>
<h3>
<a th:href="@{/register}">Register</a>
</h3>
<h3>
<a th:href="@{/login}">Login</a>
</h3>
</div>
</body>
</html>
If there’s anything else you need to take a look at in order to troubleshoot this, i’ll happily oblige.