springcloud初探-搭建微服务Eureka实现服务提供者集群Feign简化消费者操作+负载均衡和熔断器等
Posted Fire king
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了springcloud初探-搭建微服务Eureka实现服务提供者集群Feign简化消费者操作+负载均衡和熔断器等相关的知识,希望对你有一定的参考价值。
springcloud
搭建前准备
- springboot默认的mysql版本是8.几,建立springcloud项目时父工程导入
以下依赖会出现时区问题:
<!--使用druid整合mysql数据库 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
- 创建消费者模块的时候出现了bug,原因是子工程继承父工程的依赖
<!--使用druid整合mysql数据库 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<!--阿里数据源 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.12</version>
</dependency>
这些依赖会去寻找数据源,但消费者不需要配置数据源,所以找不到。
Action:
Consider the following:
If you want an embedded database (H2, HSQL or Derby), please put it on the classpath.
If you have database settings to be loaded from a particular profile you may need to activate it (no profiles are currently active).
解决:
主启动类
@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)
搭建微服务工程
1.建立父工程(打pom包)
pom.xml管理整个微服务工程的依赖
2.导包
注释掉有关redis的依赖,不然后面的操作可能会出错。
<!--导入springBoot依赖包 -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.1.RELEASE</version>
<relativePath />
</parent>
<properties>
<java.version>1.8</java.version>
</properties>
<!--依赖管理,用于管理spring-cloud的依赖 -->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Finchley.SR2</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<repositories>
<repository>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<url>https://repo.spring.io/milestone</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
<dependencies>
<!--导入springCloudjar包 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-stream</artifactId>
</dependency>
<!--引入springBoot jar包 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency> -->
<!--支持热部署 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>springloaded</artifactId>
<version>1.2.8.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency>
<!--整合redis -->
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-redis</artifactId>
</dependency>
<!--导入pojo插件 -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<!--使用druid整合mysql数据库 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<!--阿里数据源 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.12</version>
</dependency>
<!--mybatis-plus配置 -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.0.6</version>
</dependency>
</dependencies>
2.普通maven创建子工程服务提供者和服务消费者
3.配置服务提供者和消费者的.yml文件
3.1.服务提供者:
server:
port: 8082
servlet:
context-path: /
#配置访问端口和访问的根路径
#配置数据源
spring:
datasource:
type: com.alibaba.druid.pool.DruidDataSource #使用druid连接池
url: jdbc:mysql://localhost:3306/db_shop?characterEncoding=utf8
password: root
username: root
driver-class-name: com.mysql.jdbc.Driver
druid: #配置 Druid 的相关参数
# 初始化大小,最小,最大
initial-size: 5
min-idle: 5
max-active: 20
max-wait: 60000 # 配置获取连接等待超时的时间
time-between-eviction-runs-millis: 60000 # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位毫秒
min-evictable-idle-time-millis: 300000 # 配置一个连接在池中最小生存时间
validation-query: SELECT 1 #SELECT 1 FROM sys_user
test-while-idle: true
test-on-borrow: false
test-on-return: false
pool-prepared-statements: true # 打开 PSCache,并且指定每个连接上 PSCache 的大小
max-pool-prepared-statement-per-connection-size: 20
#filters: stat,wall,log4j # 配置监控统计拦截的 Filter,去掉后监控界面 SQL 无法统计,wall 用于防火墙
web-stat-filter: # 配置 DruidStatFilter
enabled: true
url-pattern: /*
exclusions: .js,*.gif,*.jpg,*.bmp,*.png,*.css,*.ico,/druid/*
stat-view-servlet: # 配置 DruidStatViewServlet
url-pattern: /druid/*
# IP 白名单,没有配置或者为空,则允许所有访问
allow: 127.0.0.1
# IP 黑名单,若白名单也存在,则优先使用
deny: 192.168.31.253
# 禁用 html 中 Reset All 按钮
reset-enable: false
# 登录用户名/密码
login-username: root
login-password: 123456
#视图解析配置——可配可不配
mvc:
view:
prefix: /templates/
suffix: .html
#Mybatis——plus
mybatis-plus:
type-aliases-package: edu.xlh.pojo #配置别名
mapper-locations: classpath:mappers/*.xml #指定映射文件的位置
configuration:
map-underscore-to-camel-case: false #自动开启驼峰规则映射
3.2.服务消费者:
server:
port: 8081
servlet:
context-path: /
4.服务提供者添加mysql驱动依赖
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.45</version>
</dependency>
5.服务提供者程序入口类
添加@SpringBootApplication
注解和@MapperScan("edu.xlh.mapper")
扫描持久层包
//主启动类
@SpringBootApplication
@MapperScan("edu.xlh.mapper")
public class SpringCloud8082provider {
public static void main(String[] args) {
SpringApplication.run(SpringCloud8082provider.class,args);
}
}
6.服务消费者程序入口类
添加@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)
注解
@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)
public class SpringCloud8081consumer {
public static void main(String[] args) {
SpringApplication.run(SpringCloud8081consumer.class,args);
}
}
7.测试
7.1.配置远程调用组件:
@Configuration
public class RestTemplateConfig {
@Bean//创建对象交给spring管理
public RestTemplate getTemplate(){
return new RestTemplate();
}
}
7.2.服务提供者-8082:
@Controller
@RequestMapping("/user")
public class UserController {
@Autowired
private UserService userService;
@GetMapping("/provider/getAll")
@ResponseBody
public List<User> findAllUserInfo(){
System.out.println("----------8082服务");
return userService.findAllUsers();
}
7.3.服务消费者-8081:
@Controller
@RequestMapping("/user")
public class UserControllerConsumer {
//PROVIDER-USER代表两个服务提供者的实例
private String commonUrl="http://localhost:8082/user/";
@Autowired
private RestTemplate restTemplate;
@RequestMapping("/consumer/find")
@ResponseBody
public List<User> findAllUsers(){
String url = commonUrl+"provider/getAll";
List list = restTemplate.getForObject(url, List.class);
return list;
}
localhost:8081/user//consumer/find
访问
8.抽取接口
8.1.建子模块
8.2.打jar包安装到本地仓库
8.3.服务提供者和消费者导入依赖
<!--引入接口-->
<dependency>
<groupId>edu.xlh</groupId>
<artifactId>springcloud-interface</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
9.通过注册Eureka实现服务提供者集群
9.1.建子模块
9.2.导入依赖
<!--添加 eureka 注册中心 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
出错时可能还要加的依赖:
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>2.3.0</version>
</dependency>
<dependency>
<groupId>com.sun.xml.bind</groupId>
<artifactId>jaxb-impl</artifactId>
<version>2.3.0</version>
</dependency>
<dependency>
<groupId>org.glassfish.jaxb</groupId>
<artifactId>jaxb-runtime</artifactId>
<version>2.3.0</version>
</dependency>
<dependency>
<groupId>javax.activation</groupId>
<artifactId>activation</artifactId>
<version>1.1.1</version>
</dependency>
9.3.配置application.yml
server:
port: 7000 #定义注册中心端口
eureka:
server:
enable-self-preservation: true #设定自我保护模式 默认值为true 不建议关闭
instance:
hostname: localhost #eureka服务的实例名称,如果有多个服务名称必须不同
client:
register-with-eureka: false #表示注册中心 不会注册自己本身
fetch-registry: false #表示自己就是注册中心,不需要检索服务
service-url:
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
#defaultZone: http://localhost:7000/eureka
9.4.建立一个端口为8083的服务提供者
修改从8082服务提供者copy过来的application.yml中的端口为8083:
server:
port: 8083
servlet:
context-path: /
9.5.在两个服务的提供者和一个消费者application.yml配置Eureka客户端
9.5.1.提供者:
其中instance-id: provider-user-8082
与不同端口号服务以此区别,例如8083服务提供者instance-id: provider-user-8083
#这个是配置Eureka 的客户端
application: #定义服务名称,如果是多个相同的服务,则名称必须相同
name: provider-user
eureka:
client:
service-url:
defaultZone: http://localhost:7000/eureka
instance:
instance-id: provider-user-8082 #定义微服务的名称
prefer-ip-address: true #是否显示IP和端口
配置后的yml
以上是关于springcloud初探-搭建微服务Eureka实现服务提供者集群Feign简化消费者操作+负载均衡和熔断器等的主要内容,如果未能解决你的问题,请参考以下文章
SpringCloud Hoxton——初探 & Eureka服务注册与发现
云原生微服务SpringCloud-eureka(server)集群搭建
:初探Spring Cloud Eureka+Hystrix+Ribbon+Feign微服务搭建
:初探Spring Cloud Eureka+Hystrix+Ribbon+Feign微服务搭建