搭建监控数据聚合Turbine
注册中中心
启动项
package com.xfgg.demo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
@SpringBootApplication
@EnableEurekaServer
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
配置文件
server:
port: 8761
spring:
application:
name: eureka-server
eureka:
instance:
prefer-ip-address: true
hostname: ${spring.cloud.client.ip-address}
instance-id: ${spring.cloud.client.ip-address}:${spring.application.name}:${server.port}
client:
register-with-eureka: false
fetch-registry: false
service-url:
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
聚合中心
启动项
package com.xfgg.demo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.cloud.netflix.hystrix.EnableHystrix;
import org.springframework.cloud.netflix.hystrix.dashboard.EnableHystrixDashboard;
import org.springframework.cloud.netflix.turbine.EnableTurbine;
@SpringBootApplication
@EnableEurekaClient
@EnableHystrix
@EnableHystrixDashboard
@EnableTurbine
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
配置文件
server.port=8762
spring.application.name=hystrix-dashboard-turbine
eureka.instance.prefer-ip-address=true
eureka.instance.hostname=${spring.cloud.client.ip-address}
eureka.instance.instance-id=${spring.cloud.client.ip-address}:${spring.application.name}:${server.port}
eureka.client.service-url.defaultZone=http://${eureka.instance.hostname}:8761/eureka/
turbine.app-config=turbine-a,turbine-b
turbine.aggregator.cluster-config=default
turbine.cluster-name-expression=new String("default")
hystrix.dashboard.proxy-stream-allow-list=127.0.0.1
服务A
启动项
package com.xfgg.demo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.cloud.netflix.hystrix.EnableHystrix;
import org.springframework.cloud.netflix.hystrix.dashboard.EnableHystrixDashboard;
import org.springframework.cloud.openfeign.EnableFeignClients;
@SpringBootApplication
@EnableEurekaClient
@EnableFeignClients
@EnableHystrixDashboard
@EnableHystrix
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
配置文件
server.port=8090
spring.application.name=turbine-a
eureka.instance.prefer-ip-address=true
eureka.instance.hostname=${spring.cloud.client.ip-address}
eureka.instance.instance-id=${spring.cloud.client.ip-address}:${spring.application.name}:${server.port}
eureka.client.service-url.defaultZone= http://${eureka.instance.hostname}:8761/eureka/
management.endpoints.web.exposure.include=*
feign.hystrix.enabled=true
feign接口
package com.xfgg.demo.feign;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.RequestMapping;
@FeignClient(value = "turbine-b",fallback = FeignApiFallBack.class)
public interface FeignApi {
@RequestMapping("/b")
String b();
}
feign回退实现类
package com.xfgg.demo.feign;
import org.springframework.stereotype.Component;
@Component
public class FeignApiFallBack implements FeignApi{
@Override
public String b() {
return "Hello!aUseB fail";
}
}
控制层调用A服务
package com.xfgg.demo.controller;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class ASayHelloController {
@Value("${server.port}")
private String port;
@RequestMapping("/a")
public String a(){
return "Hello!Im a.port:"+port;
}
}
A服务调用B服务
package com.xfgg.demo.controller;
import com.xfgg.demo.feign.FeignApi;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class AUseBFeignController {
@Autowired(required = false)
private FeignApi feignApi;
@RequestMapping("/aUseB")
public String aUseB(){
return feignApi.b();
}
}
服务B
服务B和服务A大致上一样只是修改了名字和调用的不同
测试
测试时是其中一个一直成功,另一个一直失败可以看出明显的差距
首先是最近10s的错误率一个是100%一个是0%
一个圆圈成粉色,另一个是绿色
颜色的变化——实例的健康程度:它的健康度从绿色、黄色、橙色、红色递减。
大小的变化——实例的请求流量:流量越大该实心圆就越大
一个短路熔断数为6,失败和异常数为1,另一个一切正常
曲线:用来记录2分钟内流量的相对变化,我们可以通过它来观察到流量的上升和下降趋势
测试的数据不够大看不出太大的变化,明天打算使用postman对代码进行测试
使用Mysql+mybatis进行增删改查
整体结构
配置文件
spring.application.name=client-school-provider
server.port=8762
eureka.client.service-url..defaultZone=http://localhost:8761/eureka/
#数据源相关配置
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/kgc?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull&allowMultiQueries=true
spring.datasource.username=root
spring.datasource.password=123456
#映射xml文件
mybatis.mapper-locations=mapper/*.xml
mybatis.type-aliases-package=com.xfgg.demo
主文件
package com.xfgg.demo;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
@SpringBootApplication
@EnableEurekaClient
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
实体类
package com.xfgg.demo.entity;
import lombok.Data;
@Data
public class Classes {
private Integer cid;
private String cname;
public String getCname() {
return cname;
}
public void setCname(String cname) {
this.cname = cname;
}
public Integer getCid() {
return cid;
}
public void setCid(Integer cid) {
this.cid = cid;
}
}
package com.xfgg.demo.entity;
import lombok.Data;
@Data
public class Student {
private Integer sid;
private String sname;
private String password;
private String subject;
private Float result;
public Student(Integer sid, String sname, String password, String subject, Float result) {
this.sid = sid;
this.sname = sname;
this.password = password;
this.subject = subject;
this.result = result;
}
public Student() {
}
public Integer getSid() {
return sid;
}
public void setSid(Integer sid) {
this.sid = sid;
}
public String getSname() {
return sname;
}
public void setSname(String sname) {
this.sname = sname;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getSubject() {
return subject;
}
public void setSubject(String subject) {
this.subject = subject;
}
public Float getResult() {
return result;
}
public void setResult(Float result) {
this.result = result;
}
}
数据库编写
CREATE TABLE classes(
cid int primary key auto_increment,
cname varchar(10) not null
);
CREATE TABLE student(
sid int primary key auto_increment,
sname varchar(10) not null,
password varchar(10) not null,
subject varchar(10) not null,
result float(3,1) not null
);
INSERT INTO classes (cid,cname) VALUES("1","KD59");
INSERT INTO classes (cid,cname) VALUES("2","KD66");
INSERT INTO classes (cid,cname) VALUES("3","KD67");
INSERT INTO student(sid,sname,password,subject,result) VALUES("1","张三","123","java","89.8");
INSERT INTO student(sid,sname,password,subject,result) VALUES("2","李四","123","html","88.8");
INSERT INTO student(sid,sname,password,subject,result) VALUES("3","王五","mysql","java","87.8");
mapper层
package com.xfgg.demo.mapper;
import com.xfgg.demo.entity.Classes;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;
import java.util.List;
@Mapper
public interface ClassesMapper {
@Select("select * from classes")
List<Classes> selectClasses();
}
package com.xfgg.demo.mapper;
import com.xfgg.demo.entity.Student;
import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Update;
import java.util.List;
import java.util.Map;
@Mapper
public interface StudentMapper {
List<Map<String,Object>> selectStudent(Student student);
@Insert("INSERT INTO kgc.student (sname,password,subject,result,cid) VALUES (#{sname},#{password},#{subject},#{result},#{classes.cid})")
Integer insertStudent(Student student);
@Update("UPDATE kgc.student SET sname =#{sname}, password =#{password}, subject =#{subject}, result =#{result}, cid =#{classes.cid} WHERE sid =#{sid}")
Integer updateStudent(Student student);
@Delete("delete from sudent where sid=#{sid}")
Integer deleteStudent(Integer sid);
}
service接口层
package com.xfgg.demo.service;
import com.xfgg.demo.entity.Classes;
import java.util.List;
public interface ClassesService {
List<Classes> showOptions();
}
package com.xfgg.demo.service;
import com.xfgg.demo.entity.Student;
import java.util.List;
import java.util.Map;
public interface StudentService {
List<Map<String,Object>> showData();
Map<String,Object> showInfo(Integer key);
Map<String,Object> login(String sname,String password);
Integer addData(Student student);
Integer editData(Student student);
Integer delData(Integer key);
}
service实现层
package com.xfgg.demo.service.impl;
import com.xfgg.demo.entity.Classes;
import com.xfgg.demo.mapper.ClassesMapper;
import com.xfgg.demo.service.ClassesService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.List;
@Service
public class ClassesServiceImpl implements ClassesService {
@Resource
private ClassesMapper mapper;
@Override
public List<Classes> showOptions() {
return mapper.selectClasses();
}
}
package com.xfgg.demo.service.impl;
import com.xfgg.demo.entity.Student;
import com.xfgg.demo.mapper.StudentMapper;
import com.xfgg.demo.service.StudentService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.List;
import java.util.Map;
@Service
public class StudentServiceImpl implements StudentService {
@Resource
private StudentMapper mapper;
@Override
public List<Map<String, Object>> showData() {
return mapper.selectStudent(new Student());
}
@Override
public Map<String, Object> showInfo(Integer key) {
Student student = new Student(key,null,null,null,null);
Map<String,Object> map = mapper.selectStudent(student).get(0);
return map;
}
@Override
public Map<String, Object> login(String sname, String password) {
Student student=new Student(null,sname,password,null,null);
Map<String, Object> map=mapper.selectStudent(student).get(0);
return map;
}
@Override
public Integer addData(Student student) {
return mapper.insertStudent(student);
}
@Override
public Integer editData(Student student) {
return mapper.updateStudent(student);
}
@Override
public Integer delData(Integer key) {
return mapper.deleteStudent(key);
}
}
controller层
package com.xfgg.demo.controller;
import com.xfgg.demo.entity.Classes;
import com.xfgg.demo.entity.Student;
import com.xfgg.demo.service.ClassesService;
import com.xfgg.demo.service.StudentService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import java.util.List;
import java.util.Map;
@Controller
public class CenterController {
@Autowired
private ClassesService classesService;
@Autowired
private StudentService studentService;
@RequestMapping("/options.do")
public List<Classes> optionsData(){
return classesService.showOptions();
}
@RequestMapping("/data.do")
public List<Map<String,Object>> StuData(){
return studentService.showData();
}
@RequestMapping("/info.do")
public Map<String,Object> infoData(Integer key){
return studentService.showInfo(key);
}
@RequestMapping("/login.do")
public Map<String,Object> login(String sname,String password){
return studentService.login(sname,password);
}
@RequestMapping("/add.do")
public Integer addData(Student student){
return studentService.addData(student);
}
@RequestMapping("/edit.do")
public Integer editData(Student student){
return studentService.editData(student);
}
@RequestMapping("/delete.do")
public Integer delData(Integer key){
return studentService.delData(key);
}
}
XML编写
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.xfgg.demo.mapper.StudentMapper">
<select id="selectStudent" parameterType="Student" resultType="map">
SELECT s.*,c.cname from student s,classes c where s.sid=c.cid
<if test="sid!=null">
and s.sid=#{sid}
</if>
<if test="sname!=null and password!=null">
and s.sname=#{sname} and s.password=#{password}
</if>
</select>
</mapper>