springcloud学习笔记(整合eureka+feign独立API)

编程入门 行业动态 更新时间:2024-10-24 12:30:55

springcloud<a href=https://www.elefans.com/category/jswz/34/1770117.html style=学习笔记(整合eureka+feign独立API)"/>

springcloud学习笔记(整合eureka+feign独立API)

记录一下基础的入门配置,方便学习理解。

推荐原学习文章地址:=1&

备注:版本号不一样,很多maven依赖的id也不一样,刚开始做测试用的是springboot2.1.3,springcloud是Green,出了很多问题,后来就降低成1.5,edg版本了。

Point:积分系统服务提供者、常规的springboot三层。service层和model层分离出来丢在了point-share,pom直接添加share的依赖

point-share:积分系统公共服务(主要是模型和service层)、分离出单独maven项目供其他服务调用

order:订单系统(添加point-share依赖)消费者

1:eureka服务:

pom:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns=".0.0" xmlns:xsi=""xsi:schemaLocation=".0.0 .0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>1.5.20.RELEASE</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.example</groupId><artifactId>eureka</artifactId><version>0.0.1-SNAPSHOT</version><name>eureka</name><description>Demo project for Spring Boot</description><properties><java.version>1.8</java.version><spring-cloud.version>Edgware.SR5</spring-cloud.version></properties><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-server</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies><dependencyManagement><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>${spring-cloud.version}</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build></project>

启动类:

@EnableEurekaServer
@SpringBootApplication
public class EurekaApplication {public static void main(String[] args) {SpringApplication.run(EurekaApplication.class, args);}}

配置文件:

server:port: 8761
eureka:instance:hostname: localhostclient:registerWithEureka: falsefetchRegistry: falseserviceUrl:defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
spring:application:name: eureka-server

 

2:Point服务提供者

pom:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns=".0.0" xmlns:xsi=""xsi:schemaLocation=".0.0 .0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>1.5.20.RELEASE</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.example</groupId><artifactId>point</artifactId><version>0.0.1-SNAPSHOT</version><name>point</name><description>Demo project for Spring Boot</description><properties><java.version>1.8</java.version><spring-cloud.version>Edgware.SR5</spring-cloud.version><mybatis-spring-boot>1.3.0</mybatis-spring-boot><mysql-connector>5.1.39</mysql-connector><access.ver>1.0.1</access.ver><fastjson.version>1.2.47</fastjson.version></properties><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><!-- MySQL 连接驱动依赖 --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>${mysql-connector}</version></dependency><!-- SpringBoot Mybatis 依赖 --><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>${mybatis-spring-boot}</version></dependency><!-- lombok依赖 可以减少大量的模块代码--><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency><!--Slf4j 依赖--><dependency><groupId>org.slf4j</groupId><artifactId>jcl-over-slf4j</artifactId></dependency><!-- logback 依赖 是slf4j的实现--><dependency><groupId>ch.qos.logback</groupId><artifactId>logback-classic</artifactId></dependency><dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId></dependency><!-- access 接口直接使用resultObj对象--><dependency><groupId>com.bjj</groupId><artifactId>access</artifactId><version>${access.ver}</version></dependency><!-- Druid数据库连接池组件 --><dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.0.18</version></dependency><!-- fastjson --><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>${fastjson.version}</version></dependency><dependency><groupId>com.example</groupId><artifactId>point-share</artifactId><version>0.0.1-SNAPSHOT</version></dependency></dependencies><dependencyManagement><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>${spring-cloud.version}</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build></project>

配置文件

server:port: 8882
eureka:client:serviceUrl:defaultZone: http://localhost:8761/eureka/
spring:application:name: point-serverdatasource:url: jdbc:mysql://localhost:3306/test?useUnicode=true&amp;characterEncoding=UTF-8username: rootpassword:driverClassName: com.mysql.jdbc.Drivertype: com.alibaba.druid.pool.DruidDataSourceinitialSize: 5minIdle: 5maxActive: 20maxWait: 60000timeBetweenEvictionRunsMillis: 60000minEvictableIdleTimeMillis: 300000validationQuery: SELECT 1 FROM DUALtestWhileIdle: truetestOnBorrow: falsetestOnReturn: falsepoolPreparedStatements: truemaxPoolPreparedStatementPerConnectionSize: 20filters: stat,wallconnectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000#mybatis:
#  typeAliasesPackage: com.example.point.model
#  mapperLocations: classpath:mapper/*.xml
#开启输出sql日志
logging:level:com:example:point:dao: DEBUG

启动类:


@MapperScan("com.example.point.dao")
@EnableEurekaClient
@SpringBootApplication
public class PointApplication {public static void main(String[] args) {SpringApplication.run(PointApplication.class, args);}}

添加三层:

controller方法

package com.example.point.web;import com.example.pointshare.feign.PointService;
import com.example.pointshare.model.Point;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.*;/*** Created by hui.yunfei@qq on 2019/5/14*/
@RestController
@RequestMapping("/point")
@Slf4j
public class PointController {@Value("${server.port}")String point;@Autowiredprivate PointService pointService;@RequestMapping(value="/sayHi",method= RequestMethod.GET)public void sayHi(@RequestParam(value="name") String name){log.info("point sayHi in name: {},point: {}",name,point);pointService.sayHi(name);}@RequestMapping(value="/findById/{id}",method= RequestMethod.GET)public Point findById(@PathVariable(value="id") String id){log.info("point findById in:{} ",id);Point point=pointService.findById(id);return point;}@RequestMapping(value="/findByIdAndName",method= RequestMethod.POST)public Point findByIdAndName(@RequestParam(value="id") String id,@RequestParam(value="name") String name){log.info("point findByIdAndName in:{},{} ",id,name);Point point=pointService.findByIdAndName(id,name);return point;}@RequestMapping(value="/update",method= RequestMethod.POST)public void update(@RequestBody Point point){log.info("point update in:{}",point);pointService.update(point);}
}

 service实现类(service分离出去了,后续补充):

package com.example.point.service;import com.example.point.dao.PointDao;
import com.example.pointshare.feign.PointService;
import com.example.pointshare.model.Point;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;import java.util.Date;/*** Created by hui.yunfei@qq on 2019/5/14*/
@Slf4j
@Service
public class PointServiceImpl implements PointService {@AutowiredPointDao pointDao;@Overridepublic void sayHi(String name) {log.info("point feignImpl sayHi in:{} ",name);}@Overridepublic Point findById(String id) {return pointDao.findById(id);}@Overridepublic Point findByIdAndName(String id, String name) {return pointDao.findByIdAndName(id,name);}@Overridepublic void update(Point point) {point.setUpdateTime(new Date());pointDao.update(point);}
}

dao层(直接方便测试就用了注解sql,没有mapper文件):

package com.example.point.dao;import com.example.pointshare.model.Point;
import org.apache.ibatis.annotations.*;
import org.apache.ibatis.jdbc.SQL;/*** Created by hui.yunfei@qq on 2019/5/15*/
//@Mapper 启动目录已经添加了@MapperScan("com.example.point.dao"),这里可以省略
public interface PointDao {@Select("select * from t_point where id=#{id}")//公用同一个resultMap可以添加mapper文件写映射关系@Results(value = {@Result(id = true, property = "id", column = "id"),@Result(property = "userId", column = "user_id"),@Result(property = "point", column = "point"),@Result(property = "updateTime", column = "update_time")})Point findById(String id);@Select("select * from t_point where id=#{id} and user_id=#{name}")@Results(value = {@Result(id = true, property = "id", column = "id"),@Result(property = "userId", column = "user_id"),@Result(property = "point", column = "point"),@Result(property = "updateTime", column = "update_time")})Point findByIdAndName(@Param("id") String id, @Param("name") String name);@UpdateProvider(type = PointSql.class, method = "update")void update(Point point);class PointSql {public String update(Point point) {return new SQL() {{UPDATE("t_point");//条件写法.if (point.getPoints() != 0) {SET("points=points+#{points}");}if (point.getUpdateTime() != null) {SET("update_time=#{updateTime}");}WHERE("id=#{id}");}}.toString();}}
}

 3:point-share(feign公共API)

pom:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns=".0.0" xmlns:xsi=""xsi:schemaLocation=".0.0 .0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>1.5.21.RELEASE</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.example</groupId><artifactId>point-share</artifactId><version>0.0.1-SNAPSHOT</version><name>point-share</name><description>Demo project for Spring Boot</description><properties><java.version>1.8</java.version><spring-cloud.version>Edgware.SR5</spring-cloud.version><mybatis-spring-boot>1.3.0</mybatis-spring-boot><mysql-connector>5.1.39</mysql-connector><access.ver>1.0.1</access.ver><fastjson.version>1.2.47</fastjson.version></properties><dependencies><!--<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId></dependency>--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-feign</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><!-- lombok依赖 可以减少大量的模块代码--><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency><!--Slf4j 依赖--><dependency><groupId>org.slf4j</groupId><artifactId>jcl-over-slf4j</artifactId></dependency><!-- logback 依赖 是slf4j的实现--><dependency><groupId>ch.qos.logback</groupId><artifactId>logback-classic</artifactId></dependency></dependencies><dependencyManagement><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>${spring-cloud.version}</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement><build><plugins><!--<plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin>--><!-- 编译插件 --><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId></plugin></plugins></build></project>

service:

package com.example.pointshare.feign;import com.example.pointshare.model.Point;
import feign.Logger;
import lombok.extern.slf4j.Slf4j;
import org.springframework.cloudflix.feign.FeignClient;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.*;/*** Created by hui.yunfei@qq on 2019/5/13*/
@FeignClient(value = "point-server",fallback = PointService.PointFeignHystric.class,configuration = PointService.FeignConfiguration.class)
public interface PointService {@RequestMapping(value="/point/sayHi",method= RequestMethod.GET)void sayHi(@RequestParam(value = "name") String name);@RequestMapping(value="/point/findById/{id}",method= RequestMethod.GET)Point findById(@PathVariable("id") String id);@RequestMapping(value="/point/findByIdAndName",method= RequestMethod.POST)//, consumes = MediaType.APPLICATION_JSON_VALUEPoint findByIdAndName(@RequestParam("id") String id, @RequestParam("name") String name);@RequestMapping(value="/point/update",method= RequestMethod.POST)//@RequestLine("POST /point/update")void update(@RequestBody Point point);@Component@Slf4jpublic class PointFeignHystric implements PointService {@Overridepublic void sayHi(String name) {log.info("sayHi feign error");}@Overridepublic Point findById(String id) {return null;}@Overridepublic Point findByIdAndName(String id, String name) {return null;}@Overridepublic void update(Point point) {}}/*** Created by hui.yunfei@qq on 2019/5/15*/@Configurationpublic class FeignConfiguration {@BeanLogger.Level feignLoggerLevel() {return Logger.Level.FULL;}}}

 model:

package com.example.pointshare.model;import lombok.Data;
import lombok.ToString;import java.util.Date;/*** Created by hui.yunfei@qq on 2019/5/13*/
@Data
@ToString
public class Point {private String id;private String userId;private int points;private Date updateTime;
}

4:order消费者

pom:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns=".0.0" xmlns:xsi=""xsi:schemaLocation=".0.0 .0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>1.5.20.RELEASE</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.example</groupId><artifactId>order</artifactId><version>0.0.1-SNAPSHOT</version><name>order</name><description>Demo project for Spring Boot</description><properties><java.version>1.8</java.version><spring-cloud.version>Edgware.SR5</spring-cloud.version><mybatis-spring-boot>1.3.0</mybatis-spring-boot><mysql-connector>5.1.39</mysql-connector><access.ver>1.0.1</access.ver><fastjson.version>1.2.47</fastjson.version></properties><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-feign</artifactId></dependency><!-- MySQL 连接驱动依赖 --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>${mysql-connector}</version></dependency><!-- SpringBoot Mybatis 依赖 --><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>${mybatis-spring-boot}</version></dependency><!-- lombok依赖 可以减少大量的模块代码--><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency><!--Slf4j 依赖--><dependency><groupId>org.slf4j</groupId><artifactId>jcl-over-slf4j</artifactId></dependency><!-- logback 依赖 是slf4j的实现--><dependency><groupId>ch.qos.logback</groupId><artifactId>logback-classic</artifactId></dependency><dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId></dependency><!-- access 接口直接使用resultObj对象--><dependency><groupId>com.bjj</groupId><artifactId>access</artifactId><version>${access.ver}</version></dependency><!-- Druid数据库连接池组件 --><dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.0.18</version></dependency><!-- fastjson --><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>${fastjson.version}</version></dependency><dependency><groupId>com.example</groupId><artifactId>point-share</artifactId><version>0.0.1-SNAPSHOT</version></dependency></dependencies><dependencyManagement><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>${spring-cloud.version}</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build></project>

配置文件:

server:port: 8881
eureka:client:serviceUrl:defaultZone: http://localhost:8761/eureka/
spring:application:name: order-serverdatasource:url: jdbc:mysql://localhost:3306/test?useUnicode=true&amp;characterEncoding=UTF-8username: rootpassword:driverClassName: com.mysql.jdbc.Drivertype: com.alibaba.druid.pool.DruidDataSourceinitialSize: 5minIdle: 5maxActive: 20maxWait: 60000timeBetweenEvictionRunsMillis: 60000minEvictableIdleTimeMillis: 300000validationQuery: SELECT 1 FROM DUALtestWhileIdle: truetestOnBorrow: falsetestOnReturn: falsepoolPreparedStatements: truemaxPoolPreparedStatementPerConnectionSize: 20filters: stat,wallconnectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000#日志
logging:level:com:example:pointshare:#开启输出feignfeign:PointService: DEBUG#开启断路由
feign:hystrix:enabled: true

启动类:

package com.example.order;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloudflix.eureka.EnableEurekaClient;
import org.springframework.cloudflix.feign.EnableFeignClients;@EnableEurekaClient
@EnableFeignClients(basePackages = "com.example.pointshare.feign")
@SpringBootApplication(scanBasePackages = {"com.example"})
public class OrderApplication {public static void main(String[] args) {SpringApplication.run(OrderApplication.class, args);}}

controller:

package com.example.order.web;import com.example.order.service.OrderService;
import com.example.pointshare.model.Point;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;/*** Created by hui.yunfei@qq on 2019/5/14*/
@Slf4j
@RestController
@RequestMapping("/order")
public class OrderController {@Autowiredprivate OrderService orderService;@RequestMapping(value="/sayHi",method= RequestMethod.GET)public void sayHi(@RequestParam(value="name") String name){log.info("order sayHi in:{} ",name);orderService.sayHi(name);}@RequestMapping(value="/findById/{id}",method= RequestMethod.GET)public Point findById(@PathVariable(value="id") String id){log.info("order findById in:{} ",id);return orderService.findById(id);}@RequestMapping(value="/findByIdAndName",method= RequestMethod.POST)public Point findByIdAndName(@RequestParam(value="id") String id,@RequestParam(value="name") String name){log.info("order findByIdAndName in:{},{} ",id,name);return orderService.findByIdAndName(id,name);}@RequestMapping(value="/update",method= RequestMethod.POST)public void update(@RequestBody Point point){log.info("order update in:{}",point);orderService.update(point);}
}

service:

package com.example.order.service;import com.example.pointshare.model.Point;/*** Created by hui.yunfei@qq on 2019/5/15*/
public interface OrderService {void sayHi(String name);Point findById(String id);Point findByIdAndName(String id, String name);void update(Point point);
}

service实现类:

package com.example.order.service.impl;import com.example.order.service.OrderService;
import com.example.pointshare.feign.PointService;
import com.example.pointshare.model.Point;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;/*** Created by hui.yunfei@qq on 2019/5/15*/
@Service
public class OrderServiceImpl implements OrderService {@Autowiredprivate PointService pointService;@Overridepublic void sayHi(String name) {pointService.sayHi(name);}@Overridepublic Point findById(String id) {return pointService.findById(id);}@Overridepublic Point findByIdAndName(String id, String name) {return pointService.findByIdAndName(id,name);}@Overridepublic void update(Point point) {pointService.update(point);}}

代码:

.git(后续其他中间件测试可能会修改代码,以本文档贴出来的代码为准)

其中point可以启动多端口多实例,feign直接就已经实现了负载均衡。断路由hystric在feignclient里边配置了。包括feign的日志记录。

更多推荐

springcloud学习笔记(整合eureka+feign独立API)

本文发布于:2024-03-08 22:09:46,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1722586.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:学习笔记   独立   springcloud   eureka   API

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!