if you want disabled the DTD verification for a proxy problem for example, true by default
微服务间调用
服务提供者
前面已经将用户服务注册到了eureka注册中心,但是还没有暴漏任何API给服务消费者调用。
新建controller类:
package com.luffy.userservice.controller;
import com.luffy.userservice.entity.User;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
import java.util.Random;
@RestController
public class UserController {
@GetMapping("/user")
public String getUserService(){
return "this is user-service";
}
@GetMapping("/user-nums")
public Integer getUserNums(){
return new Random().nextInt(100);
}
//{"id": 123, "name": "张三", "age": 20, "sex": "male"}
@GetMapping("/user/{id}")
public User getUserInfo(@PathVariable("id") int id){
User user = new User();
user.setId(id);
user.setAge(20);
user.setName("zhangsan");
user.setSex("male");
return user;
}
}
实体类User.java
package com.luffy.userservice.entity;
public class User {
private int id;
private String name;
private int age;
private String sex;
public int getAge() {
return age;
}
public int getId() {
return id;
}
public String getName() {
return name;
}
public String getSex() {
return sex;
}
public void setAge(int age) {
this.age = age;
}
public void setId(int id) {
this.id = id;
}
public void setName(String name) {
this.name = name;
}
public void setSex(String sex) {
this.sex = sex;
}
}
application.yml
增加从环境变量中读取EUREKA_SERVER
和EUREKA_INSTANCE_HOSTNAME
配置
server:
port: 7000
eureka:
client:
serviceUrl:
defaultZone: ${EUREKA_SERVER:http://${EUREKA_USER:admin}:${EUREKA_PASS:admin}@localhost:8761/eureka/}
instance:
instance-id: ${eureka.instance.hostname}:${server.port}
prefer-ip-address: true
hostname: user-service
#eureka客户端需要多长时间发送心跳给eureka服务器,表明他仍然或者,默认30秒
lease-renewal-interval-in-seconds: 2
#eureka服务器在接受到实例的最后一次发出的心跳后,需要等待多久才可以将此实例删除
lease-expiration-duration-in-seconds: 2
spring:
application:
name: user-service
CICD持续交付服务提供者
deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: user-service
namespace: {{NAMESPACE}}
spec:
replicas: 1
selector:
matchLabels:
app: user-service
template:
metadata:
labels:
app: user-service
spec:
imagePullSecrets:
- name: registry-172-21-65-226
containers:
- name: user-service
image: {{IMAGE_URL}}
imagePullPolicy: IfNotPresent
ports:
- containerPort: 7000
resources:
requests:
memory: 400Mi
cpu: 50m
limits:
memory: 2Gi
cpu: 2000m
env:
- name: EUREKA_SERVER
value: "http://admin:admin@eureka-cluster-0.eureka:8761/eureka/,http://admin:admin@eureka-cluster-1.eureka:8761/eureka/,http://admin:admin@eureka-cluster-2.eureka:8761/eureka/"
- name: INSTANCE_HOSTNAME
valueFrom:
fieldRef:
fieldPath: metadata.name
service.yaml
apiVersion: v1
kind: Service
metadata:
name: user-service
namespace: {{NAMESPACE}}
spec:
ports:
- port: 7000
protocol: TCP
targetPort: 7000
selector:
app: user-service
sessionAffinity: None
type: ClusterIP
status:
loadBalancer: {}
ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: user-service
namespace: {{NAMESPACE}}
spec:
ingressClassName: nginx
rules:
- host: {{INGRESS_USER_SERVICE}}
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: user-service
port:
number: 7000
ingress配置:
$ kubectl -n luffy edit configmap devops-config
...
data:
INGRESS_ELADMIN_API: eladmin.luffy.com
INGRESS_ELADMIN_WEB: eladmin-web.luffy.com
INGRESS_SPRINGBOOTDEMO: springboot.luffy.com
INGRESS_USER_SERVICE: user-service.luffy.com
NAMESPACE: luffy
kind: ConfigMap
...
Jenkinsfile
@Library('luffy-devops') _
pipeline {
agent { label 'jnlp-slave'}
options {
timeout(time: 20, unit: 'MINUTES')
gitLabConnection('gitlab')
}
environment {
IMAGE_REPO = "172.21.65.226:5000/spring-cloud/user-service"
IMAGE_CREDENTIAL = "credential-registry"
DINGTALK_CREDS = credentials('dingTalk')
PROJECT = "user-service"
DEV_NAMESPACE = "luffy"
}
stages {
stage('checkout') {
steps {
container('tools') {
checkout scm
}
}
}
stage('mvn-package') {
steps {
container('tools') {
script{
sh 'mvn clean package'
}
}
}
}
stage('CI'){
failFast true
parallel {
stage('Unit Test') {
steps {
echo "Unit Test Stage Skip..."
}
}
stage('Code Scan') {
steps {
container('tools') {
script {
devops.scan().start()
}
}
}
}
}
}
stage('docker-image') {
steps {
container('tools') {
script{
devops.docker(
"${IMAGE_REPO}",
"${GIT_COMMIT}",
IMAGE_CREDENTIAL
).build().push()
}
}
}
}
stage('deploy') {
steps {
container('tools') {
script{
devops.deploy("manifests",true,"manifests/deployment.yaml").start()
}
}
}
}
}
post {
success {
script{
devops.notificationSuccess(PROJECT,"dingTalk")
}
}
failure {
script{
devops.notificationFailed(PROJECT,"dingTalk")
}
}
}
}
pom.xml
<finalName>${project.artifactId}</finalName>
Dockerfile
FROM openjdk:8-jdk-alpine
COPY target/user-service.jar app.jar
ENV JAVA_OPTS=""
CMD [ "sh", "-c", "java $JAVA_OPTS -jar /app.jar" ]
sonar-project.properties
sonar.projectKey=user-service
sonar.projectName=user-service
# if you want disabled the DTD verification for a proxy problem for example, true by default
# JUnit like test report, default value is test.xml
sonar.sources=src/main/java
sonar.language=java
sonar.tests=src/test/java
sonar.java.binaries=target/classes
创建user-service项目,提交代码:
git init
git remote add origin http://gitlab.luffy.com/luffy-spring-cloud/user-service.git
git add .
git commit -m "Initial commit"
git push -u origin master
# 提交到develop分支
git checkout -b develop
git push -u origin develop
创建Jenkins任务,测试自动部署
访问http://user-service-dev.luffy.com/
验证