Dubbo简介;应用设置Dubbo;与OpenFeign的区别

一,Dubbo简介

dubbo框架是做微服务通信的,是由阿里巴巴开发,后捐赠给阿帕奇基金会。

二、与OpenFeign的区别

dubbo是采用RPC协议实现微服务通信,OpenFeign是采用Http请求的方式实现的。

OpenFeign 最简单的,就是Spring公司开发的,整合SpringBoot的时候,代码简洁。

阿里开发的,国内用的较多;OpenFeign国外用的多

三,应用设置Dubbo

要创建三个工程(分别对应RPC),api工程,消费者工程(consumer)和提供者工程(provider),api工程是用于另外两个工程引用的。

消费者工程和提供者工程 是要有共同的引用的,比如说:在传递请求的时候,要用user对象,那这个user对象就可以定义在api工程里,这样两个工程就都可以用了。还有Service层接口,也是要放到api工程里的。

0、启动nacos和redis

1、准备工程

创建三个项目

2、编写api工程

【1.添加依赖】


    <properties>
        <java.version>1.8</java.version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <spring-boot.version>2.6.13</spring-boot.version>
        <jwt.version>0.7.0</jwt.version>
        <fastjson.version>1.2.60</fastjson.version>
        <spring-cloud-alibaba.version>2.0.3.RELEASE</spring-cloud-alibaba.version>
        <spring-cloud.version>Finchley.SR2</spring-cloud.version>
    </properties>
    <dependencies>

        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>${fastjson.version}</version>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.24</version>
            <scope>compile</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>
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>${spring-cloud-alibaba.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <!--2.添加当前项目所依赖的插件: -->
    <build>
        <plugins>
            <!--1.添加tomcat插件 -->
            <plugin>
                <groupId>org.apache.tomcat.maven</groupId>
                <artifactId>tomcat7-maven-plugin</artifactId>
                <version>2.2</version>
                <configuration>
                    <port>8080</port>
                    <path>/</path>
                </configuration>
            </plugin>
            <!--2.添加Spring Boot 的打包插件 -->
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>2.1.10.RELEASE</version>
                <configuration>
                    <fork>true</fork>
                </configuration>
            </plugin>
        </plugins>
    </build>

【2.添加实体类Score】

package com.jr.entry;

import lombok.Data;
import java.io.Serializable;

@Data
public class Score implements Serializable {
    private String name;
    private Double score;
}

注意:实体类Score一定要实现Serializable接口,否则会报错

【3.添加ScoreService接口】

package com.jr.service;

import com.jr.entry.Score;
import java.util.List;

public interface ScoreService {

    public List<Score> getinfo();

}

【4.添加工具类Result】

package com.jr.util;

import lombok.Data;
import java.util.HashMap;
import java.util.Map;

@Data
public class Result {

    private Integer code;
    private String message;
    private Map<String, Object> map = new HashMap<>();

    private Result() {
    }

    public static Result ok() {
        Result r = new Result();
        r.setCode(ResultCode.SUCCESS.getCode());
        r.setMessage(ResultCode.SUCCESS.getMessage());
        return r;
    }

    public static Result error() {
        Result r = new Result();
        r.setCode(ResultCode.ERROR.getCode());
        r.setMessage(ResultCode.ERROR.getMessage());
        return r;
    }

    public Result put(String key, Object value) {
        map.put(key, value);
        return this;
    }

    public Object get(String key) {
        return map.get(key);
    }
}

【5.添加枚举ResultCode】

package com.jr.util;

public enum ResultCode {
    SUCCESS(0, "请求成功"),
    ERROR(1, "请求失败"),
    ;

    private int code;
    private String message;

    ResultCode(int code, String message) {
        this.code = code;
        this.message = message;
    }

    public int getCode() {
        return code;
    }

    public String getMessage() {
        return message;
    }
}

3、准备Consumer工程

【1.添加依赖】

  <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.7.RELEASE</version>
    </parent>

    <properties>
        <java.version>1.8</java.version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <spring-boot.version>2.6.13</spring-boot.version>
        <jwt.version>0.7.0</jwt.version>
        <fastjson.version>1.2.60</fastjson.version>
        <spring-cloud-alibaba.version>2.0.3.RELEASE</spring-cloud-alibaba.version>
        <spring-cloud.version>Finchley.SR2</spring-cloud.version>
    </properties>
    <dependencies>
        <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>compile</scope>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
        <!--json-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>${fastjson.version}</version>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.session</groupId>
            <artifactId>spring-session-data-redis</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        </dependency>
        <!--引入api工程依赖 -->
        <dependency>
            <groupId>com.jr</groupId>
            <artifactId>dubboapi</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
       <!--引入dubbo依赖 -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-dubbo</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>
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>${spring-cloud-alibaba.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>
                <configuration>
                    <classifier>exec</classifier>
                </configuration>
            </plugin>
        </plugins>
    </build>

【2.创建SessionConfig配置类】

package com.jr.config;

@Configuration
public class SessionConfig {

    @Bean
    public CookieSerializer cookieSerializer() {
        DefaultCookieSerializer serializer = new DefaultCookieSerializer();
        serializer.setCookieName("JSESSIONID");
        serializer.setCookiePath("/");
        serializer.setDomainNamePattern("^.+?\\.(\\w+\\.[a-z]+)$");
        return serializer;
    }

    @Bean
    public RedisSerializer<Object> redisSerializer() {
        return new GenericJackson2JsonRedisSerializer();
    }
}

【3.创建控制器UserController】

package com.jr.controller;

@RestController
@RequestMapping("/user")

public class UserController {

    @Autowired
    private UserService userService;

    @GetMapping
    public Result getinfo(){
        User user = userService.getinfo();
        return Result.ok().put("data",user);
    }
}

【4.创建实体类User】

package com.jr.entry;

@Component
@Data
public class User {

    private String id;
    private String name;
    private String password;
    private List<Score> scoreList;
}

【5.创建UserService接口】

package com.jr.service;

public interface UserService {

    public User getinfo();
}

【6.创建UserServiceImpl实现类】

package com.jr.service.impl;

import org.springframework.stereotype.Service;

@Service
public class UserServiceImpl implements UserService {

    @Reference
    private ScoreService scoreService;

    @Override
    public User getinfo() {
        User user=new User();
        user.setId("111");
        user.setName("zhangsan");
        user.setPassword("zs123");
        List<Score> list=scoreService.getinfo();
        user.setScoreList(list);
        return user;
    }
}

【7.创建启动类】

package com.jr;

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

【8.编写application.properties配置文件】

spring.application.name=dubbocon

【9.编写application.yml配置文件】

server:
  port: 100

spring:
  session:
    store-type: redis

dubbo:
  registry:
    address: nacos://192.168.43.8:8848
  cloud:
    subscribed-services: dubbopro   #是p工程的服务名
  consumer:
    check: false

【10.编写bootstrap.yml配置文件】

spring:
  cloud:
    nacos:
      discovery:
        server-addr: 192.168.43.8:8848
      config:
        server-addr: 192.168.43.8:8848
        file-extension: yaml
        namespace: d2a5ce42-8836-4dc4-89e0-9f8620b82327
        shared-configs:
          - data-id: dz14redissession.yaml
            group: DEFAULT_GROUP
    inetutils:
      preferred-networks: 192.168.56

4、准备Provider工程

【1.添加依赖】同上

【2.创建SessionConfig配置类】同上

【3.创建ScoreServiceImpl接口实现类】

package com.jr.service.impl;

import org.apache.dubbo.config.annotation.Service;

@Service
public class ScoreServiceImpl implements ScoreService {
    @Override
    public List<Score> getinfo() {
        List<Score> list=new ArrayList<>();
        for(int i=0;i<3;i++){
            Score score=new Score();
            score.setName("admin");
            score.setScore(Math.random()*100);
            list.add(score);
        }
        return list;
    }
}

注意:

@Service 是apache.dubbo. 包下的,不是springframework包下。

【4.创建启动类】同上

【5.编写application.properties配置文件】

spring.application.name=dubbopro

【6.编写application.yml配置文件】

server:
  port: 200

spring:
  session:
    store-type: redis

dubbo:
  scan:
    base-packages: com.jr.service  #指定把哪一个包下面的Servlet交给dubbo去管理。
  protocol:
    name: dubbo
    port: -1
  registry:
    address: nacos://192.168.43.8:8848
  cloud:
    subscribed-services: ""

【7.编写bootstrap.yml配置文件】同上

注意:

启动时,要先启动consumer工程,后启动provider工程,避免出现启动失败的错误。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值